13

Ich versuche, eine Fragmenttransaktion nach dem Anfordern von Berechtigungen in Android durchzuführen - jedoch stürzt die App ständig ab. Wie kann dieser Code geändert werden, um dies zu vermeiden?Android Fatal Error - Kann diese Aktion nach onSaveInstanceState nicht ausführen

Jede Hilfe wird geschätzt.

Check PERMISSIONS VOR DER EINREICHUNG E-MAIL:

private void emailShare() { 
    if (mayRequestContacts()) { 
     emailShareImpl(); 
    } 
} 

Check PERMISSIONS:

private boolean mayRequestContacts() { 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { 
      return true; 
     } 

     requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); 

     return false; 
    } 

PERMISSION TEST ERGEBNIS:

@Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     if (requestCode == REQUEST_READ_CONTACTS) { 
      if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       emailShareImpl(); 
      } 
     } 
    } 

INITIIEREN FRAGMENT Transaktion, wenn die Erlaubnis erteilt:

private void emailShareImpl() { 
     FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); 
     EmailReferDialog mEmailReferDialog = new EmailReferDialog(); 
     mEmailReferDialog.setCancelable(true); 
     mEmailReferDialog.show(fragmentManager, "EMAIL_REFER_DIALOG"); 
    } 

Logcat:

05-11 09:04:58.859 16113-16113/com.example E/AndroidRuntime: FATAL EXCEPTION: main 
                  Process: com.example, PID: 16113 
                  java.lang.RuntimeException: Failure delivering result ResultInfo{[email protected]:requestPermissions:, request=65536, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.example/com.example.DashboardActivity}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
                   at android.app.ActivityThread.deliverResults(ActivityThread.java:3743) 
                   at android.app.ActivityThread.handleSendResult(ActivityThread.java:3786) 
                   at android.app.ActivityThread.-wrap16(ActivityThread.java) 
                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1412) 
                   at android.os.Handler.dispatchMessage(Handler.java:102) 
                   at android.os.Looper.loop(Looper.java:148) 
                   at android.app.ActivityThread.main(ActivityThread.java:5466) 
                   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:1493) 
                   at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1511) 
                   at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:638) 
                   at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:617) 
                   at android.support.v4.app.DialogFragment.show(DialogFragment.java:139) 
                   at com.example.ReferFragment.emailShareImpl(ReferFragment.java:222) 
                   at com.example.ReferFragment.onRequestPermissionsResult(ReferFragment.java:140) 
                   at android.support.v4.app.FragmentActivity.onRequestPermissionsResult(FragmentActivity.java:894) 
                   at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:6582) 
                   at android.app.Activity.dispatchActivityResult(Activity.java:6460) 
                   at android.app.ActivityThread.deliverResults(ActivityThread.java:3739) 
                   at android.app.ActivityThread.handleSendResult(ActivityThread.java:3786)  
                   at android.app.ActivityThread.-wrap16(ActivityThread.java)  
                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1412)  
                   at android.os.Handler.dispatchMessage(Handler.java:102)  
                   at android.os.Looper.loop(Looper.java:148)  
                   at android.app.ActivityThread.main(ActivityThread.java:5466)  
                   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)  

Antwort

24

Dies geschieht, weil onRequestPermissionresult vor Aktivität des onResume genannt wird. Sie können einfach dieses Problem beheben, indem Sie:

private boolean mShareEmail = false; 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    if (requestCode == REQUEST_READ_CONTACTS) { 
     if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      mShareEmail = true; 
     } 
    } 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    if (mShareEmail) { 
     emailShareImpl(); 
     mShareEmail = false; 
    } 
} 
+0

Ja, ich zu einem anderen Fragment bewegte. Ich hatte das gleiche Problem. Sie müssen Code in onResume setzen –

+0

@ Artem Mostyaev Vielen Dank –

2

Vielleicht ist die folgende Spitze ist ein bisschen spät, aber anstatt das Problem zu umgehen, wenn Sie nicht über die staatliche Aktivität verwenden (zum Beispiel sollte das Berechtigungsmodell staatenlos sein) sollten Sie während des Fragmentübergangs commitAllowingStateLoss verwenden.

1

ich diese Proble gelöst durch einen Handler hinzufügen:

new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       new FolderChooserDialog.Builder(ReportActivity.this) 
         .tag(REQUEST_CODE_Excel+"") 
         .show(); 
      } 
     }, 500);