Los permisos de Android M cierran mi aplicación
Comprobo los permisos necesarios en mi pantalla de inicio de sesión. El diálogo muestra pidiendo los 4 permisos que necesito. Todo bien, pero cuando aparece el cuadro de diálogo, el fondo se vuelve negro y mi aplicación se cierra (no se bloquea, sólo se cierra). Cuando haya terminado de elegir los permisos, abriré la aplicación de nuevo y continuará ejecutándose desde donde se detuvo. ¿Cómo puedo hacer que la aplicación siga funcionando mientras se muestra el diálogo de permisos? Utilizo una clase que comprueba permisos y lo llamo en la actividad de inicio de sesión.
La clase:
- Android Studio v1.3 Comprobación del uso de permisos no verificados
- FileNotFoundException (permiso denegado) al intentar escribir un archivo en sdcard en Android
- Cómo corregir Advertencia de pelusa de SMS BroadcastReceiver sin protección
- FIleObserver y ContentObserver no funcionan en Android Marshmallow
- Android Marshmallow - cómo saber "Nunca preguntar de nuevo" se comprueba antes
public abstract class RuntimePermissionsActivity extends AppCompatActivity { private SparseIntArray mErrorString; @Override protected void onCreate(@Nullable Bundle savedInstanceState){ super.onCreate(savedInstanceState); mErrorString = new SparseIntArray(); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){ super.onRequestPermissionsResult(requestCode, permissions, grantResults); int permissionCheck = PackageManager.PERMISSION_GRANTED; for (int permission : grantResults){ permissionCheck = permissionCheck + permission; } if ((grantResults.length>0) && permissionCheck == PackageManager.PERMISSION_GRANTED){ onPermissionsGranted(requestCode); } else { Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setData(Uri.parse("package:" + getPackageName())); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); startActivity(intent); } } public void requestAppPermissions(final String[] requestedPermissions, final int requestCode){ int stringId = 0; mErrorString.put(requestCode, stringId); int permissionCheck = PackageManager.PERMISSION_GRANTED; boolean shouldShowRequestPermissionRationale = false; for (String permission : requestedPermissions){ permissionCheck = permissionCheck + ContextCompat.checkSelfPermission(this, permission); shouldShowRequestPermissionRationale = ActivityCompat.shouldShowRequestPermissionRationale(this, permission); } if(permissionCheck != PackageManager.PERMISSION_GRANTED){ if(shouldShowRequestPermissionRationale){ ActivityCompat.requestPermissions(RuntimePermissionsActivity.this, requestedPermissions, requestCode); } else { ActivityCompat.requestPermissions(this, requestedPermissions, requestCode); Toast.makeText(RuntimePermissionsActivity.this, "Please relaunch the application in order for the changes to take effect!", Toast.LENGTH_LONG).show(); } } else { onPermissionsGranted(requestCode); } } public abstract void onPermissionsGranted(int requestCode); }
La llamada de actividad de inicio de sesión:
LoginActivity.super.requestAppPermissions(new String[]{Manifest.permission.READ_CONTACTS, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS);
- Llamar el show de DialogFragment () desde dentro onRequestPermissionsResult () provoca IllegalStateException en Marshmallow
- ¿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
- ¿Cómo depurar los permisos de Android 6.0?
- ¿Por qué mi actividad de Android permanece vacía después de adquirir permisos y agregar datos de lista a él?
- Compartir servicios y permisos de manifiesto del proyecto de la biblioteca
- Negación de permisos de Android en Widget RemoteViewsFactory para contenido
- ¿Debo declarar el permiso "com.android.alarm.permission.SET_ALARM" cuando se utiliza el Administrador de alarmas en Android?
- OnCreate () se llama cuando se vuelve a abrir desde una tarea reciente después de cambiar la configuración del permiso
Un ejemplo de implementación de permisos en cualquier actividad.
SampleActivity.java
public class SampleActivity extends AppCompatActivity{ private final int PERMISSION_CODE = 1; Button button; @override onCreate(Bundle savedInstance){ super.onCreate(savedInstance); setContentView(R.layout.your_layout); button = (Button)findViewById(R.id.button); button.setOnClickListener(new OnClickListener(){ @override public void onClick(View view){ requestPermissionAndContinue(); } }); //remaining code to continue using the app //your actual code should also be in this same class } private void requestPermissionAndContinue(){ if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED){ if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)){ Log.e(TAG, "permission denied, show dialog"); }else{ ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, PERMISSION_CODE); } }else{ accessContacts(); } } private void accessContacts(){ //your code once you receive permission } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if(grantResults.length > 0 && permissions[0]==PackageManager.PERMISSION_GRANTED){ accessContacts(); }else{ //redirect to settings page or ask permission again } } }
Me enfrenté al mismo problema, comprobar si la actividad android:noHistory="true"
El mismo problema aqui.
Ankit jain estaba en la pista. Quitar android:noHistory="true"
arregló el problema de N.Park .
Aunque en mi caso necesitaba ese valor para ser verdad, o al menos el comportamiento que hace (tuve una SplashScreen donde logré los permisos, y después de seguir adelante, quería que la actividad fuera de mi pila).
Asi que:
-
He eliminado la línea
android:noHistory="true"
-
En la actividad gestiono el permiso sin problemas
-
Después de eso, paso a la siguiente actividad con:
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
- La actualización de Android SharedPreferences no funciona
- Java.lang.RuntimeException: No se puede instanciar la actividad ComponentInfo / java.lang.ClassNotFoundException