问题
I am working with sd card and so trying to get permission in runtime. Here is the code:
public class MainActivity extends AppCompatActivity implements FileListFragment.OnFragmentInteractionListener {
private static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 111;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
}
...................
................
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
FileListFragment fileListFragment = FileListFragment.newInstance(0); // **Error line**
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, fileListFragment)
.commit();
} else {
finish();
}
return;
}
}
}
.............................
..................................
..........................
}
As soon as I am allow the permission it is throwing "Failure delivering result ResultInfo{who=@android:requestPermissions:, request=111, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.kaushik.fileexplorer/com.kaushik.fileexplorer.MainActivity}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState". Here is the details logcat:
08-23 16:49:29.497 3215-3215/com.kaushik.fileexplorer E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.kaushik.fileexplorer, PID: 3215
java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=111, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.kaushik.fileexplorer/com.kaushik.fileexplorer.MainActivity}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.ActivityThread.deliverResults(ActivityThread.java:3699)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1533)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1551)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:696)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:662)
at com.kaushik.fileexplorer.MainActivity.onRequestPermissionsResult(MainActivity.java:76)
at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:6553)
at android.app.Activity.dispatchActivityResult(Activity.java:6432)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
What is problem in that code?
回答1:
You should add commitAllowingStateLoss()
FileListFragment fileListFragment = FileListFragment.newInstance(0); // **Error line**
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, fileListFragment)
.commitAllowingStateLoss();
Please check this link
回答2:
This Error is because the Activity State is Not Saved and you are adding Fragment before it.
Use This Code :
FileListFragment fileListFragment = FileListFragment.newInstance(0);
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, fileListFragment)
.commitAllowingStateLoss();
And Override Your onSaveInstanceState() method and remove the super() from it.
回答3:
using commitAllowingStateLoss() is more like a hacky fix.
This problem is very similar to this one and is well explained here.
Instead it's better to set a boolean flag in onRequestPermissionsResult
and use this in onPostResume
(for Activitys) or onResume
(for Fragments) to commit the transaction.
来源:https://stackoverflow.com/questions/39101937/android-java-lang-illegalstateexception-in-onrequestpermissionsresult