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":
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.
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.