El diálogo de permiso de Android M no se muestra
permissions android-6.0-marshmallow (27)
Actualmente estoy tratando de adaptar mi aplicación al nuevo modelo de permisos de Android M.
Estoy recopilando todos los permisos que necesito, luego ejecuto
Log.i("Permissions", "Requesting permissions: " + permissions);
requestPermissions(requiredPermissions.toArray(new String[requiredPermissions.size()]), requestCodeForPermissions);
requiredPermissions tiene los permisos que necesito como
android.permission.WRITE_EXTERNAL_STORAGE
.
Esa rutina definitivamente se ejecuta ya que tengo la línea Log en el logcat:
08-07 12:52:46.469: I/Permissions(1674): Requesting permissions: android.permission.RECEIVE_BOOT_COMPLETED; android.permission.WRITE_EXTERNAL_STORAGE
Pero el cuadro de diálogo de permisos nunca se muestra, y mucho menos se llama a onRequestPermissionsResult ().
¿Qué estoy haciendo mal? Basado en algunos tutoriales descubrí que no me falta nada. Solo tengo el emulador para probar, no hay dispositivo físico. Esta es la pantalla Acerca de la configuración: Image
Vale la pena mencionar algo más: si intento abrir la descripción general de las aplicaciones instaladas desde la pantalla de inicio, solo aparece el
launcher3 has exited
.
No estoy seguro de si eso podría estar relacionado.
¿Alguien tiene una idea de por qué no se muestra?
Acabo de tener el mismo problema. Mi problema fue que escribí el permiso en el lugar equivocado del manifiesto. Asegúrese de que el permiso de uso esté fuera de la aplicación:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.google.android.gms.samples.vision.face.photo"
android:installLocation="auto"
android:versionCode="1"
android:versionName="1" >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:hardwareAccelerated="true"
android:label="FacePhotoDemo"
android:allowBackup="true"
android:icon="@drawable/icon">
Agregue permiso en el archivo de manifiesto también.
Basado en el comentario de Hilal (¡muchas gracias!): En mi caso, mi aplicación está usando tabhost y los permisos se solicitaron a una actividad dentro del tabhost. Después de comenzar una actividad separada que solicita los permisos, está funcionando.
Cambie el valor constante final a 1.
private static final int REQUEST_PERMISSION_WRITE = 1;
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_PERMISSION_WRITE);
Después de buscar un momento, parece que es necesario establecer el valor compileSdkVersion en "android-MNC" o, a partir de hoy, en 23. Eso requiere el sistema de compilación Gradle, que luego parece requerir Android Studio. Al menos no pude encontrar un solo manual sobre cómo configurarlo fuera de los archivos gradle.
En el manifiesto, cambié
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="22" />
a
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>
Quizás eso ayude.
En mi caso, el permiso que estaba solicitando (WRITE_SETTINGS) era más especial y requería Actividad de configuración para iniciar. Entonces el diálogo no aparecía.
Tenía que obtener su permiso usando el siguiente código:
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
startActivityForResult(intent, CODE_WRITE_SETTINGS_PERMISSION);
En mi caso, la solución es la cadena misma
android.permission.READ_CONTACTS
Hice Manifest.permission.READ_CONTACTS que causó un error de silencio (Nota que se muestra en la pantalla).
Asegúrese de que esto sea correcto
En mi caso, solicité "ACCESS_COARSE_LOCATION" en mi archivo de manifiesto y luego solicité el permiso "ACCESS_FINE_LOCATION" en el código, por eso no se abría el Diálogo de permisos.
En nuestro código, fue un simple error de ortografía.
Tuvimos:
<uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" />
Debería ser:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Estaba haciendo dos llamadas a requestPermissions (), una justo después de la otra. Este mensaje de error apareció en Logcat (tenga en cuenta la falta de ortografía en "solicitud"):
Can reqeust only one set of permissions at a time
requestPermissions () en realidad está diseñado para tomar múltiples solicitudes a la vez; para eso está la matriz de cadenas.
Establezca su targetSdkVersion en 22 .
Experimenté el mismo problema porque estaba usando el valor negativo como REQUEST_CODE.
requestPermissions(new String[]{android.Manifest.permission.CAMERA}, -1)
Después de usar un valor positivo, el sistema mostró el diálogo. Espero que ayude a alguien.
Experimenté el mismo problema, pero luego me di cuenta de que olvidé agregar el permiso al archivo de manifiesto. Después de agregar la etiqueta de permisos de uso, el sistema mostró el diálogo. Quizás ayude a alguien.
Hice todo lo que se dijo en las respuestas anteriores, pero todavía no se mostraba el diálogo y luego cambié
targetSdkVersion
a
23
en gradle y apareció.
Espero que esto ayude a alguien
Los permisos se organizan en categorías para que los no críticos se otorguen sin que se muestre el diálogo.
Encontré esto de la manera difícil con el permiso de Internet, si tiene este problema, entonces cambiar a un permiso crítico como read_contacts le permitirá probar su flujo y revelar si el problema es que el permiso no es crítico o algo más.
Los permisos de protección normales se enumeran aquí.
Me llevó todo el día descubrir qué causó el problema. La respuesta original me ayudó.
Lo solucioné agregando
tools:remove="android:maxSdkVersion"
esta manera:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/>
Otra causa más para que no se muestre el cuadro de diálogo de permisos al solicitar un permiso peligroso ...
Tuve que hacer Build -> Clean Project y luego Build -> Rebuild Project . Supongo que Android Studio no detectó los cambios que hice en el manifiesto.
Para agregar a la respuesta de @ shanraisshan, el
REQUEST_CODE
realidad tiene que ser mayor que 0, no solo no negativo.
Si alguno de ustedes tiene una aplicación que cambia / modifica
WRITE_SETTINGS
y enfrenta este problema.
Consulte
la respuesta de CommonsWare a WRITE_SETTINGS Ambigüedad
Me enfrenté a este problema durante 2 semanas y luego me di cuenta de que se debía a que
requestPermissions
no funciona para solicitar el permiso
WRITE_SETTINGS
.
Espero que esto ayude: D
También me he encontrado con una situación en la que el cuadro de diálogo de permisos no aparece o la aplicación se bloquea al usar el elemento
<uses-permission-sdk23>
, sin embargo, la causa parece ser un error del sistema en los dispositivos 6.0 actuales:
https://code.google.com/p/android/issues/detail?id=189841
Excepción de bloqueo:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity}: java.lang.NullPointerException: Attempt to get length of null array
Tengo el mismo problema y el problema se resuelve después de agregar shouldShowRequestPermissionRationale de esta manera:
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
} else {
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
Tuve el mismo problema. Más tarde me di cuenta de que tenemos que declarar todos y cada uno de los permisos en manifiesto (incluso si uno es una subclase de otro). En mi caso declare
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
en mi manifiesto e intentaba acceder a la ubicación aproximada del usuario.
ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
Se solucionó el problema agregando permisos generales también en manifiesto.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Tuve un problema similar causado por el caso incorrecto de la constante de permiso en el manifiesto, estaba usando
read_contacts
en minúsculas:
<uses-permission android:name="android.permission.read_contacts" />
Después de cambiar
read_contacts
a mayúsculas, comenzó a funcionar como se esperaba
<uses-permission android:name="android.permission.READ_CONTACTS" />
añadir
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
en AndroidManifest.xml
Nota: El permiso que desea obtener. Por ejemplo: android.permission.ACCESS_FINE_LOCATION etc.
tuvo el mismo problema (supongo) y la solución fue eliminar
import <app package>.Manifest;
importado automáticamente por Android Studio en la parte superior del archivo y sustitúyalo por
import android.Manifest;
y empecé a trabajar
@Override
public final void validateRequestPermissionsRequestCode(int requestCode) {
// We use 16 bits of the request code to encode the fragment id when
// requesting permissions from a fragment. Hence, requestPermissions()
// should validate the code against that but we cannot override it as we
// can not then call super and also the ActivityCompat would call back to
// this override. To handle this we use dependency inversion where we are
// the validator of request codes when requesting permissions in
// ActivityCompat.
if (!mRequestedPermissionsFromFragment
&& requestCode != -1 && (requestCode & 0xffff0000) != 0) {
throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
}
}