web-dev-qa-db-fra.com

La boîte de dialogue de permission d'Android M ne s'affiche pas

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?

57
Jens

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.

9
Jens

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.

97
Tamás Cseh

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"/>
22
Khang .NT

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.

13
shanraisshan

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">
9
サソリ

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.

9
Vinil Chandran

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" />
2
user3663026

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

}
2
Hai nguyen thanh

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
2
TheIT

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);
1
M. Usman Khan

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

1
joakim

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

1
Nick Cardoso

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

1
Naveen Rao

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.

0
Akash Bisariya

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

0
Alberto Cappellina

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 

0
Kadir Erturk

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.

0
Magnus W

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 .

0
Irfan S

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" />
0
Roberto

Définissez votre targetSdkVersion à 22 .

0
Iman Marashi
@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");
        }
    }
0
Ahmad Aghazadeh

Ajoutez également une autorisation dans le fichier manifeste.

0
Phani varma

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.

0
paperduck

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.

0
Jens

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"/>
0
shahrukhamd

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.

0
mogile_oli