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.
- Android Robolectric unidad de prueba de Marshmallow PermissionHelper
- ¿Dónde están almacenados los permisos en Android?
- Solicitar permiso en Android M sólo cuando se apunta a una API inferior
- Android Marshmallow Callback cuando el usuario revoca los permisos de la configuración?
- Android "Permiso de negación: no se puede utilizar la cámara"
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)
- Última actualización de la habilitación y deshabilitación de los datos móviles mediante programación
- ¿Cuál es la diferencia entre ACCESS_NETWORK_STATE e INTERNET?
- La aplicación de Android no solicita permisos al instalar
- OnCreate () se llama cuando se vuelve a abrir desde una tarea reciente después de cambiar la configuración del permiso
- El método checkSelfPermission (Context, String) no está definido para el tipo ContextCompat
- Forzar la aplicación a reiniciar desde la primera Actividad (cuando se deniega un permiso)
- BroadcastReceiver SMS_Received no funciona en nuevos dispositivos
- ¿Qué pasará con aplicaciones que no se actualizan y que ejecutan código que requiere un permiso que el usuario desautorizado en Android 6.0 Marshmallow
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.
- Recuperar Token de Google Access después de autenticado mediante la autenticación de Firebase
- Deshabilitar / habilitar datos móviles en Android L con acceso root