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:

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

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:

  1. He eliminado la línea android:noHistory="true"

  2. En la actividad gestiono el permiso sin problemas

  3. 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 ); 
  • El método checkSelfPermission (Context, String) no está definido para el tipo ContextCompat
  • Reproductor de música preguntando para escribir permiso de almacenamiento externo?
  • ¿Cómo evitar escribir código repetitivo duplicado para solicitar permisos?
  • ¿Cuándo necesito android.hardware.location.gps y android.hardware.location.network?
  • Última actualización de la habilitación y deshabilitación de los datos móviles mediante programación
  • Solicitud de llamadaPermisiones dos veces en llamadas de kernel personalizadas onRequestPermissionsResult antes de la respuesta del usuario
  • Comunicación con el servidor sin permiso de Internet
  • ¿Puedo recibir los intentos C2DM de otra aplicación de Android si estoy firmado con la misma firma?
  • ¿Por qué mi aplicación de mapa se bloquea si configuro maxSdkVersion en el permiso WRITE_EXTERNAL_STORAGE?
  • ¿Cómo puedo obtener un proceso de Android que se ejecuta con la capacidad CAP_NET_ADMIN
  • Comprobación del código que utiliza permisos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.