11

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

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

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

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

+1

Прочитайте это http://stackoverflow.com/questions/21196453/external-storage-permission-issue-with-mediaprovider-ring-tones или http://stackoverflow.com/questions/19837358/android-kitkat- securityexception-when-try-to-read-from-mediastore –

ответ

13

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

java.lang.SecurityException: Разрешение Отрицание: чтение com.android.providers .media.MediaProvider uri content: // media/external/images/media/35634 from pid = 25240, uid = 10070 r equires.permission.READ_EXTERNAL_STORAGE, или град ntUriPermission().

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

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

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

Проверьте, пожалуйста, this topic.

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

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

ВАЖНО:

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


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

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

ADD ON
Если вы хотите сохранить данные, которые вы должны добавить WRITE_EXTERNAL_STORAGE разрешения.

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

Клянусь, что он не работал прошлой ночью, когда я пробовал разрешение без инструментов и maxsdk, и теперь здесь он работает, как ничто никогда не происходило. Спасибо огромное! – Zheryu

+0

Рад помочь;) –

2

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

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

не работает – Karoly

1

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

0

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

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

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

Смежные вопросы