18

Mam dwie czynności w mojej aplikacji, MainActivity wywołuje ImagePicker, który ma GridView układający wszystkie obrazy w galerii telefonu, gdzie używam ContentResolver, aby uzyskać kursor.SecurityException: Odmowa uprawnień: odczyt (tylko na emulatorze)

To zadziałało na moim telefonie, gdy testowałem, ale za każdym razem rozbijało się na emulatorze.

Oto dziennik błędów:

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

mam pozwolenie napisany w oczywisty, jak pokazano poniżej:

<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

spróbować określić karta SD przestrzeni dyskowej podczas tworzenia emulatora. – userDroid

+0

Przepraszam, jak mam to zrobić? Ustawiłem go na 1G. – TPWang

Odpowiedz

23

Która wersja Androida jest emulator? I czy kompilujesz z SDK 23? Jeśli twoim emulatorem jest Marshmallow, musisz wyraźnie sprawdzić uprawnienia w czasie wykonywania. Wynika to z nowego modelu uprawnień.

Sprawdź Docs na uprawnienia o więcej informacji: https://developer.android.com/training/permissions/index.html

+0

Dziękujemy! To rozwiązało mój problem! – TPWang

+0

To nie wyjaśnia, dlaczego działa na zwykłych urządzeniach. – Day

3

Jeśli wersja aplikacji docelowej 23 to daje ten błąd, jeśli wymóg obejmuje poziom API 23 to trzeba zrobić docelową 23 i potrzebę sprawdzić uprawnienia dynamicznie tutaj jest przykład z czekiem miejscu deweloper https://developer.android.com/training/permissions/requesting.html

Uwaga:Nawet jeśli dasz cel 22 lub niższy również aplikacja będzie działać bez tego z 23 (sprawdzić uprawnienia) błąd.

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' może być dowolną intą :) Zastąpiłem moją własną stałą w zdefiniowanym przez aplikację przykładzie:' static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 99; ' – CGR

+0

Daje błąd : Nie można rozwiązać Manifestu symbolu. – Solo