18

Ich habe zwei Aktivitäten in meiner App, MainActivity ruft ImagePicker auf, der eine GridView hat, die alle Bilder in der Telefongalerie auslegt, wo ich einen ContentResolver benutze, um den Cursor zu bekommen.SecurityException: Permission Denial: Lesen (nur im Emulator)

Es funktionierte gut auf meinem Handy, als ich es getestet habe, aber stürzte jedes Mal sofort auf Emulator.

Hier ist das Fehlerprotokoll:

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

ich die Erlaubnis, in manifest geschrieben haben haben, wie unten dargestellt:

<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

try SD-Karte Speicherplatz angeben, während Emulator zu schaffen. – userDroid

+0

Tut mir leid, wie mache ich das? Ich setze es auf 1G. – TPWang

Antwort

23

Welche Version von Android ist Ihr Emulator? Und kompilieren Sie mit SDK 23? Wenn Ihr Emulator Marshmallow ist, müssen Sie zur Laufzeit explizit nach der Berechtigung suchen. Dies ist auf das neue Berechtigungsmodell zurückzuführen.

Schauen Sie sich die Dokumentation auf Berechtigungen für weitere Informationen: https://developer.android.com/training/permissions/index.html

+0

Danke! Das hat mein Problem gelöst! – TPWang

+0

Das erklärt nicht, warum es auf normalen Geräten funktioniert. – Day

3

Wenn Ihre App Zielversion ist 23, dann wird es Ihnen diesen Fehler geben, wenn Ihre Anforderung 23 API-Ebene enthält, dann müssen Sie Target 23 und Notwendigkeit machen Berechtigungen dynamisch hier ist das Beispiel von Entwicklern Website überprüft https://developer.android.com/training/permissions/requesting.html

Hinweis zu überprüfen:auch wenn Sie Ziel geben 22 oder weniger auch Ihre App wird mit 23, ohne dass dies (überprüfen Erlaubnis) Fehler arbeiten.

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' kann beliebig int sein :) Ich ersetze durch meine eigene Konstante im app-definierten Beispiel:' static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 99; ' – CGR

+0

Ergibt einen Fehler : Kann Symbol Manifest nicht auflösen. – Solo