18

У меня есть два действия в моем приложении, MainActivity вызывает ImagePicker, у которого есть GridView, который выкладывает все изображения в галерее телефона, где я использую ContentResolver для получения курсора.SecurityException: Разрешение: чтение (только на эмуляторе)

Он работал нормально на моем телефоне, когда я тестировал его, но каждый раз мгновенно разбивался на эмулятор.

Вот журнал ошибок:

java.lang.SecurityException: Permission Denial:reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=5934, uid=10060 requires android.permission.READ_EXTERNAL_STORAGE, or 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> 
+0

попытка указать сд карты дискового пространства при создании эмулятора. – userDroid

+0

Извините, как мне это сделать? Я установил его в 1G. – TPWang

ответ

23

Какая версия андроида ваш эмулятор? И вы компилируете с SDK 23? Если ваш эмулятор Marshmallow, вам нужно явно проверить разрешение во время выполнения. Это связано с новой моделью разрешений.

Заканчивать Документы на разрешениях для получения дополнительной информации: https://developer.android.com/training/permissions/index.html

+0

Спасибо! Это решило мою проблему! – TPWang

+0

Это не объясняет, почему это работает на обычных устройствах. – Day

3

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

Примечание:Даже если вы даете цели 22 или ниже, и ваше приложение будет работать с 23 без этого (проверьте разрешения) ошибки.

14

Before calling method, check for permission.

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

Check permission result.

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

'Constants.WRITE_EXTERNAL_STORAGE' может быть любым, что вы хотите :) Я заменил свою собственную константу в приложении:' static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 99; ' – CGR

+0

Дает ошибку : Не удается разрешить манифест символа. – Solo

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