Подтвердить что ты не робот

Разрешение Android READ_EXTERNAL_STORAGE не работает

Я пытаюсь создать простое приложение, которое может получить изображение из приложения Gallery и отобразить его на кнопке imageButton. Я тестирую API 21 на телефоне под управлением Android 5.0.1. К сожалению, независимо от того, что я пытаюсь, я получаю ошибку безопасности - даже когда я указываю разрешения.

Мой код для получения изображения:

@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;
    }
}

Код работает, когда я пытаюсь выбрать изображение из Dropbox, но когда я выбираю изображение из галереи, я получаю

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()

Я сделал тэг разрешения использования для READ_EXTERNAL_STORAGE дочернего элемента манифеста:

<?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>

Я искал высоко и низко на других сообщениях, но по-прежнему не могу понять, почему я все еще получаю эту неприятную ошибку.

4b9b3361

Ответ 1

ПРОБЛЕМА
У вас есть ошибка

java.lang.SecurityException: отказ в разрешении: чтение com.android.providers.media.MediaProvider uri content://media/external/images/media/35634 из pid = 25240, uid = 10070 r equires android.permission.READ_EXTERNAL_STORAGE или grantUriPermission().

ПРИЧИНА
Вы не даете правильных разрешений из-за android:maxSdkVersion="18", которые согласно документации.

Самый высокий уровень API, на котором это разрешение должно быть предоставлено вашему приложению. Установка этого атрибута полезна, если требуется разрешение, требуемое вашему приложению, начиная с определенного уровня API.

Пока вы не предоставляете разрешения для API 21, ваше приложение ведет себя нормально.

Откроем этот раздел для получения дополнительной информации.

Решение
Если вы хотите предоставить разрешения на чтение под API 21, вы должны объявить их как:

<uses-permission 
    android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="21" />

ВАЖНО:

Это имеет смысл только тогда, когда вам нужно предоставить дополнительные разрешения, потому что некоторые старые api требуют разрешений для новых версий, поэтому пользовательский интерфейс улучшается, потому что вы запрашиваете только определенные разрешения при необходимости.


Итак (в этом случае) правильный путь будет:

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

ДОБАВИТЬ
Если вы хотите сохранить данные, вы должны добавить разрешения WRITE_EXTERNAL_STORAGE.

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

Ответ 2

Просто замените нижний и попробуйте,

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

Ответ 3

При отладке на некоторых устройствах вы должны явно предоставить разрешение, перейдя к вашим настройкам → apps → MY_APPLICATION → Permissions, а затем предоставите требуемые разрешения.

Ответ 4

В дополнение к добавлению ниже в AndroidManifest.xml

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

нам также необходимо запросить разрешение в действии для приложения, чтобы фактически иметь доступ к внешнему хранилищу. https://developer.android.com/training/permissions/requesting.html