web-dev-qa-db-fra.com

API 26+: l'autorisation WRITE_EXTERNAL_STORAGE est toujours refusée

J'ai changé mon application pour cibler l'API 27 et maintenant elle ne peut pas être accordée WRITE_EXTERNAL_STORAGE permission - grantResult est toujours -1.

Mon application a besoin de cette autorisation car elle n'utilise pas d'espace de stockage externe privé (qui ne nécessite pasWRITE_EXTERNAL_STORAGE à partir de l'API 19).

Je sais que dans l'API 26, il y a eu changements de comportement pour les autorisations . Mais cela n'explique pas mon problème.

Je demande les deux READ_EXTERNAL_STORAGE et WRITE_EXTERNAL_STORAGE autorisations de manière standard:

ActivityCompat.requestPermissions(activity, new String[] {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
    }, requestCode);

(les deux autorisations sont déclarées via <uses-permission en manifeste).

La boîte de dialogue apparaît et je clique sur "Autoriser":

enter image description here

Cependant dans onRequestPermissionsResult callback je reçois un -1 (refusé) pour WRITE_EXTERNAL_STORAGE (et 0 (accordé) pour READ_EXTERNAL_STORAGE).

Le résultat ne devrait-il pas être 0 pour les deux depuis que j'ai demandé et, vraisemblablement, accordé les deux?

J'ai essayé de demander WRITE_EXTERNAL_STORAGE seul, mais dans ce cas, la boîte de dialogue n'apparaît pas du tout.

Encore un détail: je viens de vérifier le manifeste fusionné dans build/intermediates/manifests/full/debug et a remarqué que WRITE_EXTERNAL_STORAGE l'autorisation a l'attribut Android:maxSdkVersion="18" (il n'y a pas un tel attribut dans mon manifeste). Cela peut se produire car mon application a minApiVersion=21, mais je ne suis pas sur.

18
Denis Kniazhev

Quelque part le long de la ligne, vous récupérez cet attribut Android:maxSdkVersion="18". Je suppose que cela vient d'une bibliothèque. Vérifiez l'onglet "Manifesté fusionné" dans Android Studio, lorsque vous modifiez votre propre manifeste. Il contiendra des détails sur ce qui contribue aux divers éléments et attributs.

Android:maxSdkVersion A pour effet de supprimer votre élément <uses-permission> Sur les versions supérieures du Android SDK, au moins en termes de fonctionnement des autorisations d'exécution.

Étant donné que vous avez besoin de cette autorisation pour toutes les versions, l'ajout de tools:remove="Android:maxSdkVersion" Sur l'élément <uses-permission> Devrait annuler le Android:maxSdkVersion="18" Et vous donner ce que vous attendez.

32
CommonsWare