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