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>
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
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;
}
}
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).