2

我正在與SD卡,所以試圖獲得運行時的權限。下面是代碼:Android的java.lang.IllegalStateException在onRequestPermissionsResult()

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; 
      } 
     } 
    } 

............................. 
.................................. 
.......................... 

} 

只要我允許它拋出「失敗交付結果ResultInfo {誰= @安卓權限:requestPermissions :,請求= 111,結果= -1,數據=意向{act = android.content.pm.action.REQUEST_PERMISSIONS(has extras)}} to activity {com.kaushik.fileexplorer/com.kaushik.fileexplorer.MainActivity}:java.lang.IllegalStateException:在onSaveInstanceState之後無法執行此操作「。這裏是詳細信息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{[email protected]: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)  

該代碼的問題是什麼?

+0

添加你的'onSaveInstanceState'代碼? –

+0

您是否在'manifest'文件中添加了權限?如果沒有,你不能在運行時請求許可。 – Abbas

+0

@SohailZahid我根本沒有重寫onSaveInstanceState()。 –

回答

5

您應該添加commitAllowingStateLoss()

FileListFragment fileListFragment = FileListFragment.newInstance(0); // **Error line** 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.fragment_container, fileListFragment) 
       .commitAllowingStateLoss(); 

使用commitAllowingStateLoss請檢查this link

3

此錯誤是因爲活動狀態未保存並且您在其之前添加Fragment。

使用此代碼:

FileListFragment fileListFragment = FileListFragment.newInstance(0); 
    getSupportFragmentManager().beginTransaction() 
      .add(R.id.fragment_container, fileListFragment) 
      .commitAllowingStateLoss(); 

,並覆蓋你的onSaveInstanceState ()方法,並從中取出超()

0

()更像是一個哈克修復。

這個問題與這個問題非常相似,並且很好地解釋了here

相反,最好在onRequestPermissionsResult中設置布爾標誌,並在onPostResume(對於活動)或onResume(對於片段)中使用此標誌來提交事務。

相關問題