5

Я пытаюсь читать пути изображений из хранилища и я постоянно получаю SecurityException здесь:не может запросить разрешения READ_EXTERNAL_STORAGE

Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=31409, uid=10053 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() 

Я компиляция против апи 23 и разрешения четко указаны в моем Manifest как прямые ребенок моего манифеста. Я также понимаю, что в новых разрешениях времени выполнения вы должны запрашивать разрешение во время выполнения, когда хотите получить доступ к хранилищу. Когда я пишу эту линию, которая бы начать проверку для разрешения я получить не может решить проблему в IDE:

ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) 

не может разрешить символ Manifest.permission.READ_EXTERNAL_STORAGE. Единственный Manifest.permission, который я могу четко указать в моем коде, - Manifest.permission.C2D_MESSAGE, не получив ошибку, не может разрешить ошибку. Есть ли что-то еще, что мне нужно для компиляции, чтобы иметь доступ к другим разрешениям в коде?

Просто чтобы быть ясно, что это блок кода, который дает мне SecurityException:

public List<String> getCameraImagesFull(Context context) { 
     Cursor cursor = null; 
     String[] star = {"*"}; 
     ArrayList<String> result = new ArrayList<>(); 
     cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, star, null, null, MediaStore.MediaColumns.DATE_ADDED + " DESC"); 
     if (cursor != null) { 
      if (cursor.moveToFirst()) { 
       do { 
        String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); 
        result.add(path); 
       } while (cursor.moveToNext()); 
      } 
      cursor.close(); 
     } 
     return result; 
    } 

это линия, которая бросает исключение:

cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, star, null, null, MediaStore.MediaColumns.DATE_ADDED + " DESC"); 

И здесь все разрешения заявлено в моем манифесте:

<permission 
     android:name="com.example.gcm.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.USE_CREDENTIALS" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" /> 

Я просто задаюсь вопросом, как я прошу просить поэтому я могу получить пути изображения. Это все работает, когда я скомпилирован против любой сборки Lollipop, просто с новыми разрешениями времени выполнения на Marshmallow im, получающим SecurityExeption. Любые и вся помощь ценится, заранее спасибо

+0

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

+0

Хорошо, я нашел это из вашего комментария ниже. – Herry

+0

Здравствуйте, попробуйте это для API-уровня 23 http://stackoverflow.com/a/41221852/5488468 –

ответ

9

не может разрешить символ Manifest.permission.READ_EXTERNAL_STORAGE

Вам нужно добавить оператор импорта для android.Manifest, точно так же, как с любым другим классом Java ,

Единственное Manifest.permission, что я могу четко заявить в моем коде Manifest.permission.C2D_MESSAGE, не получая не может устранить ошибку

Там нет такого значения (C2D_MESSAGE) in android.Manifest.permission. Я даже не знаю, где находится класс Manifest, с внутренним классом permission с полем C2D_MESSAGE.

+0

спасибо, теперь я вижу, когда я ссылался на Manifest.permission, использовал его из моего собственного пакета приложений против пакета android. .... я могу использовать READ_EXTERNAL_STORAGE, пока я заявляю его как «android.Manifest.permission.READ_EXTERNAL_STORAGE» против «Manifest.permission.READ_EXTERNAL_STORAGE» –

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