Android lire autorisation de stockage externe ne fonctionne pas
j'essaie de créer une application simple qui peut obtenir une image de L'application Galerie et l'afficher sur un bouton d'image. Je teste avec API 21 sur un téléphone sous Android 5.0.1. Malheureusement, peu importe ce que j'essaie, je reçois une erreur de sécurité - même quand je spécifier les autorisations.
mon code pour récupérer l'image est:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent){
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch(requestCode){
case PICK_IMAGE_REQUEST:
if(resultCode == RESULT_OK && imageReturnedIntent != null && imageReturnedIntent.getData() != null) {
Uri uri = imageReturnedIntent.getData();
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
// Log.d(TAG, String.valueOf(bitmap));
ImageButton ib = (ImageButton) findViewById(R.id.inputImg);
ib.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
break;
}
}
le code fonctionne quand j'essaie de sélectionner une image à partir de Dropbox, mais quand je sélectionne une image à partir galerie, je reçois
java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media/35634 from pid=25240, uid=10070 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
j'ai fait la balise use-permission pour READ_EXTERNAL_STORAGE un enfant de manifeste:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="[REDACTED]">
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="23" />
<uses-permission tools:node="replace" android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
<application>
[REDACTED]
</application>
</manifest>
j'ai cherché haut et bas sur d'autres messages, mais je n'arrive toujours pas à comprendre pourquoi j'ai encore cette fâcheuse erreur.
4 réponses
problème
Vous avez l'erreur
de java.lang.SecurityException: Autorisation de Déni: lecture com.Android.Fournisseur.Média.MediaProvider uri content: / /media/external/images/media / 35634 from pid=25240, uid=10070 r equires android.autorisation.READ_EXTERNAL_STORAGE , or grantUriPermission().
CAUSE
Vous ne donnez pas correctement les permissions à cause de android:maxSdkVersion="18"
, qui selon la documentation.
le niveau D'API le plus élevé auquel cette autorisation devrait être accordée à votre application. Définir cet attribut est utile si la permission dont votre application a besoin n'est plus nécessaire à partir d'un certain niveau D'API.
aussi longtemps que vous n'avez pas donné les permissions à API 21
votre application se comporte bien.
Vérifier ce sujet pour plus d'infos.
SOLUTION
Si vous voulez donner les permissions de lecture sous API 21
, vous devez les déclarer comme:
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="21" />
IMPORTANT:
cela n'a de sens que lorsque vous avez besoin de donner des permissions supplémentaires parce que certaines anciennes api nécessitent des permissions que les nouvelles versions n'ont pas, donc l'expérience utilisateur est améliorée parce que vous ne demandez certaines permissions que lorsque cela est nécessaire.
ainsi (dans ce cas) le chemin correct sera:
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE" />
AJOUTER LE
Si vous voulez vous devez ajouter les permissions WRITE_EXTERNAL_STORAGE
.
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
remplacez simplement par celui ci-dessous et essayez,
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
pendant le débogage sur certains périphériques, vous devez accorder explicitement la permission en allant dans vos paramètres --> apps --> MY_APPLICATION --> Permissions et ensuite accorder les permissions nécessaires.
en plus d'ajouter ce qui suit dans AndroidManifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
nous devons également demander la permission dans l'activité pour que l'application ait réellement accès au stockage externe. https://developer.android.com/training/permissions/requesting.html