2016-12-06 6 views
0

Я пытаюсь получить список всех изображений на устройстве. Ключ команда для достижения этой цели является запрос команды:не удается получить android.permission.READ_EXTERNAL_STORAGE

 Cursor cursor = getContentResolver().query(
      MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, 
      null, null); 

, который я поставил в методе OnCreate() от основной деятельности.

в файле манифеста я помещал необходимого разрешения (в узле корень ):

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

Насколько я понимаю, это все, что мне нужно сделать. Однако этот код не работает (при указанной выше команде) с исключением безопасности, говоря мне, что мне нужно READ_EXTERNAL_STORAGE разрешение. Я думал, что попросил об этом, но его там нет. Я попытался отладить его, и его там нет. Я попытался добавить команду requestPermissions (...) перед запросом, и это не сработает.

точное сообщение об ошибке я получаю это:

java.lang.RuntimeException: Unable to start activity componentInfo{com.galamit.pic1/com.galamit.pic1.MainActivity}: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=26249, uid=10012 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() 

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

EDIT: разрешение запроса часть выглядит следующим образом:

if(this.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)== PackageManager.PERMISSION_DENIED) { 
    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1); 
} 
+0

Пожалуйста, объясните, что означает «это не работает». Кроме того, вы можете рассмотреть возможность вызова вашего запроса 'requestPermissions()' как части [mcve]. – CommonsWare

+0

см. Исключение. Я получаю всего несколько строк позже. – amit

+0

«см. Исключение, которое я получаю всего несколько строк позже» - это не объясняет, что «он не работает» означает в отношении вызова 'requestPermissions(). Вы не получаете это конкретное исключение из вызова 'requestPermissions()'. – CommonsWare

ответ

1

Я хотел бы понять, почему разрешение запрашивается в манифесте не хватает

Это не должно быть достаточно на устройствах Android 6.0+, если ваш targetSdkVersion равен 24 или выше. Для более новых приложений и новых устройств у вас также есть request certain permissions at runtime, а READ_EXTERNAL_STORAGE - один из них.

Причина, по которой ваш звонок requestPermissions() не работает, потому что этот вызов не является синхронным. Он асинхронный. Вы не узнаете до onRequestPermissionsResult(), есть ли у вас разрешение или нет.

Таким образом, вы должны изолировать query() работу в отдельный метод, который вы звоните из двух мест:

  • Где она сейчас, если и только если checkSelfPermission() говорит, что у вас уже есть разрешение

  • onRequestPermissionsResult(), для конкретного запроса, если результат указывает на то, что пользователь согласился предоставить вам разрешение

+0

имеет смысл. Я собираюсь попробовать это. Благодарю. – amit

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