Android Fatal Error – No se puede realizar esta acción después de onSaveInstanceState

Estoy intentando realizar una transacción de fragmentos después de solicitar permisos en Android, pero la aplicación se bloquea continuamente. ¿Cómo se podría cambiar este código para evitar esto?

Cualquier ayuda es apreciada.

COMPRUEBE LAS PERMISAS ANTES DE ENVIAR CORREO ELECTRÓNICO:

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

COMPROBAR PERMISOS:

 private boolean mayRequestContacts() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { return true; } requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); return false; } 

PERMISO COMPROBAR RESULTADO:

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

INICIAR LA TRANSACCIÓN DE FRAGMENTO SI PERMISO CONCEDIDO:

  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) 

Esto ocurre porque onRequestPermissionresult se llama antes onResume la actividad. Usted puede simplemente solucionar esto siguiendo:

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

Tal vez el siguiente consejo es un poco tarde, pero en lugar de una solución, si no usas el estado de la actividad (por ejemplo, el modelo de permiso debe ser apátrida), debes usar commitAllowingStateLoss durante la transición del fragmento.

  • ¿Cuándo utilizar el permiso READ_GSERVICES?
  • ¿Cuándo necesito android.hardware.location.gps y android.hardware.location.network?
  • Cómo forzar el permiso "android.permission.CAMERA" que se agrega a manifest en Codename one
  • Actualizar aplicación a Marshmallow o Nougat
  • Dispositivos sin "Aplicaciones que utilizan datos de uso" o android.settings.USAGE_ACCESS_SETTINGS intención
  • Archivo de manifiesto de Android: App soporta tabletas, pero está marcado como "no compatible" en el mercado?
  • RequestPermission () no recrea completamente la pila de actividad
  • ¿Cómo Distinguimos Nunca-Preguntado de Stop-Ask en los permisos de tiempo de ejecución de Android M?
  • Android studio Acción llamada para ejecutar códigos USSD
  • ¿Puedo solicitar un permiso en ciertas versiones de Android?
  • Android, encuentra todos los lugares en código para solicitar permisos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.