2015-09-09 7 views
6

ich diese als meine Berechtigungen:Permission Verweigerung von MediaDocumentsProvider

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

Ich erhalte eine Erlaubnis Leugnung Fehler hier auf der openInputStream Linie:

if(bgUri != null && !bgUri.isEmpty()) { 
      try { 
       InputStream inputStream = context.getContentResolver().openInputStream(Uri.parse(bgUri)); // <-- error 
       return Drawable.createFromStream(inputStream, bgUri); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
     } 

ich zum ersten Mal mit

mein Bild laden

dann speichern Sie das Bild uri:

  String backgroundURI = imageUri.toString(); 
      int backgroundID = 0; 
      mStore.backgroundImageURI = backgroundURI; 
      mStore.backgroundImageNumber= backgroundID; 
      mStore.save(); 

Stapelüberwachung:

﹕ FATAL EXCEPTION: main 
Process: com.myapp.pocketandroid, PID: 1284 
java.lang.RuntimeException: Unable to resume activity {com.myapp.pocketandroid/com.myapp.pocketandroid.MainActivity}: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{52946004 1284:com.myapp.pocketandroid/u0a60} (pid=1284, uid=10060) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS 
     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2774) 
     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2803) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2238) 
     at android.app.ActivityThread.access$800(ActivityThread.java:135) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5001) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{52946004 1284:com.myapp.pocketandroid/u0a60} (pid=1284, uid=10060) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS 
     at android.os.Parcel.readException(Parcel.java:1465) 
     at android.os.Parcel.readException(Parcel.java:1419) 
     at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2848) 
     at android.app.ActivityThread.acquireProvider(ActivityThread.java:4399) 
     at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2208) 
     at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1425) 
     at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1047) 
     at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:904) 
     at android.content.ContentResolver.openInputStream(ContentResolver.java:629) 
     at com.myapp.pocketandroid.Utils.BackgroundImageManager.background(BackgroundImageManager.java:29) 
     at com.myapp.pocketandroid.BaseActivity.setBackground(BaseActivity.java:83) 
     at com.myapp.pocketandroid.BaseActivity.onResume(BaseActivity.java:44) 

Warum erhalte ich die MediaDocumentsProvider Erlaubnis Absturz, wenn ich meine Tätigkeit wieder aufnehmen und versuchen, den URI zu laden? Ich dachte, wenn ich die Erlaubnis nehme, behalte ich die Erlaubnis für immer.

+0

Geben Sie Ihren Code ein, der "versucht, den URI zu laden", zusammen mit dem vollständigen Stack-Trace. – CommonsWare

+1

@CommonsWare der Absturz ist im ersten Codeblock. Ich habe einen Stack-Trace hinzugefügt. – quantumpotato

+0

Was tun Sie zwischen dem Aufruf von 'takePersistableUriPermission()' und 'openInputStream()'? Du hast geschrieben, dass du diesen Absturz bekommst, wenn du "deine Aktivität" fortsetzt. Meinst du das wörtlich (d. H. Es ist die gleiche Aktivitätsinstanz, die du mit 'takePersistableUriPermission()' benutzt hast und gerade wieder in den Vordergrund rückt)? Oder meinst du etwas anderes? – CommonsWare

Antwort

1

Es scheint, dass Sie die "get freshest data" von here und die SELECT_PHOTO von here verwenden. Richtig? Angenommen, das ist der Fall ---

Das SELECT_PHOTO Beispiel verwendet eine ACTION_PICK, um das Foto auszuwählen. Quoting:

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); 
photoPickerIntent.setType("image/*"); 
startActivityForResult(photoPickerIntent, SELECT_PHOTO); 

jedoch als pointed out hat Intent.ACTION_PICK keine Garantien über persistability. Verwenden Sie stattdessen Intent.ACTION_OPEN_DOCUMENT. Vom API docs, für API 19 oder höher:

Alle ausgewählten Dokumente werden an die aufrufende Anwendung mit persistierbar Lese zurückgegeben und die Erlaubnis gewährt schreiben. Wenn Sie den Zugriff auf die Dokumente über Geräte-Neustarts hinweg beibehalten möchten, müssen Sie die persistenten Berechtigungen mithilfe von takePersistableUriPermission (Uri, int) explizit übernehmen.

Intent photoPickerIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
photoPickerIntent.setType("image/*"); 
startActivityForResult(photoPickerIntent, SELECT_PHOTO); 

versuchen und sehen, wie Sie tun.

+0

versuchen .. dieses ... – quantumpotato

+0

Abstürze noch beim Laden. – quantumpotato

+0

Immer noch der gleiche Fehler? Kannst du das Ganze auf Github oder irgendwo veröffentlichen? Das Problem kann hier außerhalb der Zitate liegen. – cxw