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 без этой ошибки (проверить разрешение).