web-dev-qa-db-fra.com

Android Fatal Error - Impossible d'effectuer cette action après onSaveInstanceState

J'essaie d'effectuer une transaction de fragment après avoir demandé des autorisations dans Android. Cependant, l'application se bloque continuellement. Comment ce code pourrait-il être modifié afin d'éviter cela?

Toute aide est appréciée.

VÉRIFIEZ LES AUTORISATIONS AVANT D'ENVOYER UN COURRIEL:

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

VÉRIFIER LES AUTORISATIONS:

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

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

        return false;
    }

RÉSULTAT DE LA VÉRIFICATION DES AUTORISATIONS:

  @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();
            }
        }
    }

COMMENCER LA TRANSACTION DE FRAGMENT SI AUTORISE:

 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{who=@Android: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) 
14

Cela se produit parce que onRequestPermissionresult est appelé avant la onResume de l'activité. Vous pouvez simplement résoudre ce problème en suivant:

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;
    }
}
26
Artem Mostyaev

Le conseil suivant est peut-être un peu tardif, mais au lieu d’une solution de contournement, si vous n’utilisez pas l’état de l’activité (par exemple, le modèle d’autorisation doit être sans état), vous devez utiliser commitAllowingStateLoss pendant la transition de fragment.

2
lionheart

j'ai résolu ce problème en ajoutant un gestionnaire:

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