2017-06-07 1 views
0

sloved"verwendet-Erlaubnis" in manifest Zugabe nicht funktioniert

Senden der Absicht wie

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
intent.setType("image/*"); 
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE); 

Im onActivityResult Methode

imageUri = data.getData(); 
    getContentResolver().takePersistableUriPermission(imageUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); 

Ich habe festgestellt, dass dies ein häufiges Problem. Ich bekomme einen java.lang.SecurityException: Permission Denial: Fehler beim Versuch, userImg.setImageURI(tmp.photo); in meinem Code. Ich habe viele Lösungen auf SO aber nichts versucht. Ich habe auch versucht mit Gleiten, aber kein Glück dort. Die uri wird in ein Objekt eingelesen, das ich zur Laufzeit im Speicher ablege, und ich fordere es mit tmp.photo an. Ich habe mit der Protokollierung überprüft, dass das Uri erfolgreich in das photo Attribut übergeben wurde. Was kann ich tun?

diese sind in meinem Manifest.

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

Mein Code ist sehr einfach.

ImageView userImg = (ImageView) findViewById(R.id.userImg); 
userImg.setImageURI(tmp.photo); 

wobei tmp.photo ein Uri-Objekt ist. Dies erzeugt alle diese

Unable to open content: content://com.android.providers.media.documents/document/image%3A156 
java.lang.SecurityException: Permission Denial: 
opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord 
{74dbab7 13175:com.example.gus.uniman/u0a168} (pid=13175, uid=10168) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS 
at android.os.Parcel.readException(Parcel.java:1684) 
at android.os.Parcel.readException(Parcel.java:1637) 
at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:4199) 
at android.app.ActivityThread.acquireProvider(ActivityThread.java:5478) 
at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2239) 
at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1517) 
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1131) 
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:984) 
at android.content.ContentResolver.openInputStream(ContentResolver.java:704) 
at android.widget.ImageView.getDrawableFromUri(ImageView.java:900) 
at android.widget.ImageView.resolveUri(ImageView.java:871) 
at android.widget.ImageView.setImageURI(ImageView.java:490) 
at com.example.gus.uniman.PersonDetails.onCreate(PersonDetails.java:78) 
at android.app.Activity.performCreate(Activity.java:6682) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2619) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727) 
at android.app.ActivityThread.-wrap12(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6121) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 
06-07 19:24:36.919 13175-13175/com.example.gus.uniman W/ImageView: resolveUri failed on bad bitmap uri: content://com.android.providers.media.documents/document/image%3A156 
06-07 19:24:37.030 13175-13207/com.example.gus.uniman D/OpenGLRenderer: endAllActiveAnimators on 0x76706ab800 (ListView) with handle 0x768d4df4a0 
+0

welche android version/api ist passiert? Nougat? –

+0

API 25, läuft auf einem Nexus 6P, das 7.1.2 mit Juni-Patches hat. –

+0

müssen Sie Laufzeitberechtigungen anfordern – tyczj

Antwort

1

Sie nur Rechte an den Inhalten der Uri identifiziert haben:

  • In Ihrer ursprünglichen Komponente (zB die Aktivität, die die Uri über onActivityResult() von ACTION_GET_CONTENT bekam) oder

  • In allen Komponenten, die Sie die Uri zu übergeben, wenn Sie FLAG_GRANT_READ_URI_PERMISSION in der 0 enthaltenverwendet diese Komponente zu starten, und

  • Nur während Prozess um

    ist

In Ihrem Fall irgendwo entlang der Linie, verletzt man diese Regeln. Vielleicht haben Sie die Uri an eine andere Komponente ohne FLAG_GRANT_READ_URI_PERMISSION übergeben, oder Sie haben die Uri auf der Festplatte gespeichert und versucht, sie später erneut zu verwenden.

Weitere Informationen zu Uri Zugriffszeiten finden Sie unter this blog post.

+0

Oh, ich verstehe. Da ich diese Daten in einer Datenbank speichern möchte, dachte ich, es wäre besser, nur einen Link zu ihnen zu speichern. Was soll ich stattdessen tun? –

+0

@ Dinos_12345: Wenn Sie die 'Uri' über' ACTION_OPEN_DOCUMENT' oder andere Facetten des Storage Access Framework bekommen, können Sie 'takePersistableUriPermissions()' auf 'ContentResolver' verwenden, um längerfristigen Zugriff auf den Inhalt zu haben. Bedenken Sie jedoch, dass der Benutzer diesen Inhalt "hinter Ihrem Rücken" verschieben oder löschen kann. Wenn Sie die Uri auf andere Weise erhalten, müssen Sie den Inhalt in Ihre App importieren und in eine von Ihnen kontrollierte Datei kopieren. – CommonsWare

+0

@ Dinos_12345: Die einfachste Art, sich diese 'Uri'-Werte vorzustellen, ist, dass sie URLs eines Web-Servers/Web-Services ähneln, die jedoch eine authentifizierte Benutzersitzung erfordern. Während Sie die URL irgendwo speichern können, können Sie sie möglicherweise morgen nicht verwenden, da die Sitzung des Benutzers möglicherweise abgelaufen ist. – CommonsWare

Verwandte Themen