La boîte de dialog d’autorisation Android M ne s’affiche pas

J’essaie actuellement d’adapter mon application au nouveau modèle d’permissions d’Android M.

Je recueille toutes les permissions dont j’ai besoin, puis je cours

Log.i("Permissions", "Requesting permissions: " + permissions); requestPermissions(requiredPermissions.toArray(new Ssortingng[requiredPermissions.size()]), requestCodeForPermissions); 

requiredPermissions contient les permissions 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 dialog des permissions ne s’affiche jamais, et encore moins onRequestPermissionsResult () appelé.

Qu’est-ce que je fais mal? Sur la base de quelques tutoriels, j’ai trouvé que je ne manquais de rien. Je n’ai que l’émulateur pour tester, pas de périphérique physique. Ceci est l’écran à propos des parameters: Image

Il pourrait être utile de mentionner quelque chose d’autre: si j’essaie d’ouvrir la vue d’ensemble des applications installées à partir de l’écran d’accueil, je n’ai access qu’à launcher3 has exited . Je ne sais pas si cela pourrait être lié.

Est-ce que quelqu’un a une idée de ce qui ne se voit pas?

J’ai rencontré le même problème, mais plus tard, j’ai réalisé que j’avais oublié d’append la permission au fichier manifeste. Après avoir ajouté la balise uses-permission, le système a affiché la boîte de dialog. Peut-être aide quelqu’un.

Il m’a fallu toute la journée pour découvrir la cause du problème. La réponse originale m’a aidé.

J’ai corrigé en ajoutant des tools:remove="android:maxSdkVersion" comme ceci:

  

J’ai rencontré le même problème car j’utilisais la valeur négative en tant que REQUEST_CODE.

 requestPermissions(new Ssortingng[]{android.Manifest.permission.CAMERA}, -1) 

Après avoir utilisé une valeur positive, le système a affiché la boîte de dialog. J’espère que ça aide 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 l’autorisation d’utilisation est en dehors de l’application:

        

append

   

dans AndroidManifest.xml

Note: La permission que vous voulez obtenir. Par exemple: android.permission.ACCESS_FINE_LOCATION etc.

Basé sur le commentaire de Hilal (merci beaucoup!): Dans mon cas, mon application utilise effectivement tabhost et les permissions ont été demandées pour une activité dans le tabhost. Après avoir démarré une activité distincte qui demande les permissions, elle fonctionne.

J’ai le même problème et le problème est résolu après l’ajout de la méthode shouldShowRequestPermissionRational comme suit:

 if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) { } else { ActivityCompat.requestPermissions(thisActivity, new Ssortingng[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); } 

Dans notre code, c’était une simple faute d’orthographe.

Nous avons eu:

  

CA devrait etre:

  

J’ai également rencontré une situation où la boîte de dialog d’autorisation n’apparaît pas ou l’application se bloque lorsque vous utilisez l’élément , 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

Crash exception:

 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 

J’ai fait toutes les choses dites dans les réponses ci-dessus mais le dialog n’était toujours pas targetSdkVersion et j’ai ensuite modifié targetSdkVersion à 23 dans gradle et il est apparu. J’espère que cela aide quelqu’un

Les permissions sont organisées en catégories afin que les non-critiques soient accordées sans que la boîte de dialog ne soit affichée.

J’ai trouvé cela difficile avec l’autorisation Internet, si vous rencontrez ce problème, le passage à une autorisation critique telle que read_contacts vous permettra de tester votre stream et de révéler si le problème est la non-critique ou autre chose.

Les permissions de protection normales sont répertoriées ici

Pour append à la réponse de @ shanraisshan, le REQUEST_CODE doit être supérieur à 0, pas seulement non négatif.

Après avoir cherché pendant qu’il apparait, il est nécessaire de définir la valeur comstackSdkVersion sur “android-MNC” ou aujourd’hui sur 23. Cela nécessite le système de compilation Gradle qui semble alors nécessiter Android Studio. Au moins, je n’ai pas pu trouver un seul manuel sur la façon de le définir en dehors des fichiers de graduation.

 @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"); } } 

Eu le même problème. Plus tard, j’ai réalisé que nous devions déclarer chaque permission dans le manifeste (même si l’une est une sous-classe d’une autre). Dans mon cas, j’ai déclaré

  

dans mon manifeste et essayait d’accéder à l’emplacement grossier de l’utilisateur.

 ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) 

Correction du problème en ajoutant également une autorisation grossière dans le manifeste.

   

Dans le manifeste, j’ai changé

   

à

   

Peut-être que ça aide.

Ajoutez également une autorisation dans le fichier manifeste.

Définissez votre targetSdkVersion sur 22 .

avait le même problème (je suppose) et la solution était en train de supprimer

 import .Manifest; 

importé automatiquement 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 on the screen).

Assurez-vous que c’est correct

Si quelqu’un parmi vous a une application qui modifie / modifie WRITE_SETTINGS et fait face à ce problème. Consultez la réponse de CommonsWare à WRITE_SETTINGS Ambiguity

J’ai été confronté à ce problème pendant 2 semaines et je me suis rendu compte plus tard que ce problème était dû au fait que requestPermissions ne fonctionnait pas pour demander l’autorisation WRITE_SETTINGS . J’espère que cela aide: D

Dans mon cas, j’avais demandé “ACCESS_COARSE_LOCATION” dans mon fichier manifeste, puis demandé l’autorisation “ACCESS_FINE_LOCATION” dans le code, c’est pourquoi le dialog d’autorisation ne s’ouvrait pas.

Je faisais deux appels à requestPermissions (), l’un après l’autre. Ce message d’erreur est apparu dans Logcat (notez l’orthographe erronée sur “request”):

 Can reqeust only one set of permissions at a time 

requestPermissions () est en fait conçu pour prendre plusieurs requêtes à la fois; c’est à cela que sert le tableau de chaînes.

Dans mon cas, l’autorisation que je demandais (WRITE_SETTINGS) était plus spéciale et nécessitait une activité de paramétrage à lancer. Donc, le dialog n’était pas visible.

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

Changer la valeur de la constante finale à 1.

 private static final int REQUEST_PERMISSION_WRITE = 1; ActivityCompat.requestPermissions(this,new Ssortingng[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_PERMISSION_WRITE);