J'essaie actuellement d'adapter mon application au nouveau modèle d'autorisations d'Android M.
Je collecte toutes les autorisations dont j'ai besoin, puis lance
Log.i("Permissions", "Requesting permissions: " + permissions);
requestPermissions(requiredPermissions.toArray(new String[requiredPermissions.size()]), requestCodeForPermissions);
requiredPermissions détient les autorisations dont j'ai besoin, comme Android.permission.WRITE_EXTERNAL_STORAGE
.
Cette routine est définitivement exécutée car j'ai la ligne Log dans le logcat:
08-07 12:52:46.469: I/Permissions(1674): Requesting permissions: Android.permission.RECEIVE_BOOT_COMPLETED; Android.permission.WRITE_EXTERNAL_STORAGE
Mais la boîte de dialogue des autorisations ne s'affiche jamais, encore moins s'appelle onRequestPermissionsResult ().
Qu'est-ce que je fais mal? D'après certains tutoriels, il ne me manque rien… .. Je n'ai que l'émulateur à tester, pas de périphérique physique. Voici l'écran à propos des paramètres: Image
Il est peut-être utile de mentionner autre chose: si j'essaie d'ouvrir la vue d'ensemble des applications installées à partir de l'écran d'accueil, je n'ai que launcher3 has exited
. Je ne sais pas si cela pourrait être lié.
Quelqu'un a-t-il une idée pourquoi il ne montre pas?
Sur la base du commentaire de Hilal (merci beaucoup!): Dans mon cas, mon application utilise effectivement tabhost et les autorisations ont été demandées à partir d'une activité située à l'intérieur du tabhost. Après avoir démarré une activité distincte qui demande les autorisations, cela fonctionne.
J'ai rencontré le même problème, mais plus tard, j'ai réalisé que j'avais oublié d'ajouter l'autorisation au fichier manifeste. Après avoir ajouté la balise uses-permission, le système a affiché la boîte de dialogue. Peut-être aide quelqu'un.
Il a fallu toute ma journée pour découvrir la cause du problème. Le réponse originale m'a aidé.
J'ai corrigé en ajoutant tools:remove="Android:maxSdkVersion"
comme ceci:
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="Android:maxSdkVersion"/>
J'ai rencontré le même problème parce que j'utilisais la valeur négative en tant que REQUEST_CODE.
requestPermissions(new String[]{Android.Manifest.permission.CAMERA}, -1)
Après avoir utilisé une valeur positive, le système affiche le dialogue . J'espère que cela aidera quelqu'un.
J'ai juste eu le même problème… .. Mon problème était que j'ai écrit la permission au mauvais endroit dans le manifeste… .. Assurez-vous que la permission use est en dehors de l'application:
<?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">
ajouter
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
dans AndroidManifest.xml
Remarque: L'autorisation que vous souhaitez obtenir. Exemple: Android.permission.ACCESS_FINE_LOCATION etc.
Dans notre code, c'était une simple faute d'orthographe.
Nous avons eu:
<uses-permission Android:name="Android.permission.ACCESS_COURSE_LOCATION" />
CA devrait etre:
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
J'ai le même problème et le problème est résolu après avoir ajouté le shouldShowRequestPermissionRationale comme ceci:
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
} else {
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
J'ai également rencontré une situation dans laquelle la boîte de dialogue d'autorisation n'apparaît pas ou l'application se bloque lors de l'utilisation de l'élément <uses-permission-sdk23>
, mais la cause semble être un bogue système sur les périphériques 6.0 actuels:
https://code.google.com/p/Android/issues/detail?id=189841
Exception crash:
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
Dans mon cas, l'autorisation que je demandais (WRITE_SETTINGS) était plus spéciale et l'activité Paramètres requise pour être lancée. Donc, le dialogue ne s'est pas présenté.
Je devais obtenir sa permission en utilisant le code suivant:
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
startActivityForResult(intent, CODE_WRITE_SETTINGS_PERMISSION);
Pour ajouter à la réponse de @ shanraisshan, le REQUEST_CODE
doit en réalité être supérieur à 0, pas seulement non négatif.
Les autorisations étant organisées en catégories, les autorisations non critiques sont accordées sans afficher la boîte de dialogue.
J'ai trouvé cela très difficile avec une autorisation Internet. Si vous rencontrez ce problème, le passage à une autorisation critique telle que read_contacts vous permettra de tester votre flux et d'indiquer si le problème est l'autorisation non critique ou autre chose.
Protection normale les autorisations sont listées ici
J'ai fait tout ce qui était dit dans les réponses ci-dessus mais le dialogue n'était toujours pas affiché, puis j'ai changé targetSdkVersion
en 23
dans gradle et il est apparu. J'espère que cela aide quelqu'un
Dans mon cas, j'avais demandé "ACCESS_COARSE_LOCATION" dans mon fichier de manifeste, puis une demande d'autorisation "ACCESS_FINE_LOCATION" dans le code, c'est pourquoi la boîte de dialogue Permission ne s'ouvrait pas.
avait le même problème (je suppose) et la solution était de supprimer
import <app package>.Manifest;
auto-importé par Android Studio en haut du fichier et le remplacer par
import Android.Manifest;
et a commencé à travailler
Dans mon cas, la solution est la chaîne elle-même
Android.permission.READ_CONTACTS
J'ai fait Manifest.permission.READ_CONTACTS qui a causé une erreur de silence (Noting show à l'écran)
Assurez-vous que c'est correct
Une autre raison de ne pas avoir la boîte de dialogue d'autorisation à afficher lors de la demande d'une autorisation dangereuse ...
Je devais faire Construire -> Nettoyer le projet puis Construire -> Reconstruire le projet . J'imagine qu'Android Studio n'a pas repris les modifications apportées au manifeste.
Si quelqu'un d'entre vous a une application qui modifie/modifie WRITE_SETTINGS
et est confronté à ce problème. Découvrez la réponse de CommonsWare à WRITE_SETTINGS Ambiguity
J'ai été confronté à ce problème pendant 2 semaines et plus tard, j'ai réalisé que ce problème était dû au fait que requestPermissions
ne fonctionnait pas pour demander l'autorisation WRITE_SETTINGS
.
J'ai eu un problème similaire causé par le mauvais cas de la constante d'autorisation dans le manifeste, j'utilisais read_contacts
en minuscule:
<uses-permission Android:name="Android.permission.read_contacts" />
Après avoir changé read_contacts
en majuscule, il a commencé à fonctionner comme prévu
<uses-permission Android:name="Android.permission.READ_CONTACTS" />
Définissez votre targetSdkVersion à 22 .
@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");
}
}
Ajoutez également une autorisation dans le fichier manifeste.
Je faisais deux appels à requestPermissions (), l'un après l'autre. Ce message d'erreur est apparu dans Logcat (notez l'orthographe dans "request"):
Can reqeust only one set of permissions at a time
requestPermissions () est en fait conçu pour prendre plusieurs demandes à la fois; c'est ce que le tableau String est pour.
Après quelques recherches, il semble nécessaire de définir la valeur compileSdkVersion sur "Android-MNC" ou à partir d'aujourd'hui sur 23. Cela nécessite le système de construction Gradle, qui semble alors nécessiter Android Studio .. trouvez un manuel sur la manière de le définir en dehors des fichiers Gradle.
Avait le même problème. Plus tard, j'ai réalisé que nous devions déclarer chaque permission dans manifeste (même s'il s'agit d'une sous-classe d'une autre) . Dans mon cas, j'ai déclaré
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
dans mon manifeste et essayait d'accéder à l'emplacement brut de l'utilisateur.
ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
Correction du problème en ajoutant une permission grossière aussi bien dans manifeste.
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION"/>
Dans le manifeste, j'ai changé
<uses-permission
Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"
Android:maxSdkVersion="22" />
à
<uses-permission
Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"
/>
Peut-être que ça aide.