web-dev-qa-db-fra.com

SecurityException: Permission Denial: lecture (uniquement sur émulateur)

J'ai deux activités dans mon application, MainActivity appelle ImagePicker, qui a une GridView qui présente toutes les images de la galerie du téléphone, où j'utilise un ContentResolver pour obtenir le curseur.

Cela a bien fonctionné sur mon téléphone lorsque je l'ai testé, mais s'est écrasé à chaque fois instantanément sur l'émulateur.

Voici le journal des erreurs:

Java.lang.SecurityException: refus d'autorisation: lecture du contenu uri com.Android.providers.media.MediaProvider: // media/external/images/media from pid = 5934, uid = 10060 nécessite Android.permission.READ_EXTERNAL_STORAGE, ou grantUriPermission ()

J'ai une autorisation écrite dans le manifeste, comme indiqué ci-dessous:

<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>

<application
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:theme="@style/AppTheme">
    <activity
        Android:name=".MainActivity"
        Android:label="@string/app_name"
        Android:exported="true">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity Android:name=".ImagePicker" />
</application>
19
TPWang

Quelle version de Android est votre émulateur? Et vous compilez avec le SDK 23? Si votre émulateur est Marshmallow, vous devez vérifier explicitement l'autorisation au moment de l'exécution. Cela est dû au nouveau modèle d'autorisations .

Consultez la documentation sur les autorisations pour plus d'informations: https://developer.Android.com/training/permissions/index.html

23
riggaroo

Avant d'appeler la méthode, vérifiez l'autorisation.

private void checkPermission(){
    int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {     
         ActivityCompat.requestPermissions(         
    getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, Constants.WRITE_EXTERNAL_STORAGE); 
    } else {    
         callMethod(); 
    }
}

Vérifiez le résultat de l'autorisation.

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {

            case Constants.WRITE_EXTERNAL_STORAGE:
                if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                    callMethod(); 
                }
                break;

            default:
                break;
        }
    }
16
Philip Herbert

Si la version cible de votre application est 23, cela vous donnera cette erreur, si votre exigence comprend le niveau API 23, vous devez définir la cible 23 et vérifier dynamiquement les autorisations.Voici l'exemple de la vérification du site du développeur https://developer.Android.com/training/permissions/requesting.html

Remarque: Même si vous donnez à la cible 22 ou moins, votre application fonctionnera avec 23 sans cette erreur (vérifier l'autorisation).

3
Swamy