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.

12
demandé sur Zheryu 2015-09-02 13:38:43

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" />
14
répondu Jordi Castilla 2017-05-23 12:17:54

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" />
2
répondu r j 2015-09-02 10:44:09

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.

1
répondu vimalp015 2016-11-30 13:23:40

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

0
répondu Sridhar 2017-06-08 04:34:48