SecurityException: Разрешение: чтение (только на эмуляторе)
У меня есть два действия в моем приложении, MainActivity вызывает ImagePicker, у которого GridView выкладывает все изображения в галерее телефона, где я использую ContentResolver для получения курсора.
Он отлично работал на моем телефоне, когда я тестировал его, но каждый раз мгновенно разбивался на эмулятор.
Здесь журнал ошибок:
java.lang.SecurityException: отказ в разрешении: чтение com.android.providers.media.MediaProvider uri content://media/external/images/media from pid = 5934, uid = 10060 требует android.permission.READ_EXTERNAL_STORAGE или grantUriPermission()
У меня есть разрешение, написанное в манифесте, как показано ниже:
<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>
Ответы
Ответ 1
Какая версия андроида - ваш эмулятор? И вы компилируете с SDK 23?
Если ваш эмулятор - Marshmallow, вам нужно явно проверить разрешение во время выполнения. Это связано с новой моделью разрешений.
Ознакомьтесь с документами о разрешениях для получения дополнительной информации: https://developer.android.com/training/permissions/index.html
Ответ 2
Перед вызовом метода проверьте разрешение.
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();
}
}
Проверить разрешение.
@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;
}
}
Ответ 3
Если ваша целевая версия приложения - 23, тогда она даст вам эту ошибку, если ваше требование включает в себя уровень API 23, тогда вам нужно сделать цель 23 и нужно динамически проверять разрешения, вот пример из проверки сайта разработчика https://developer.android.com/training/permissions/requesting.html
Примечание. Даже если вы даете цель 22 или ниже, также ваше приложение будет работать с 23 без этой ошибки (проверить разрешение).