2013-03-05 22 views
5

Ich habe eine Aktivität, die den Intent Filter android.intent.action.SEND mit Bildmime Typen hat.Vermeiden Sie SecurityException beim Zugriff auf DownloadProvider

Sobald die Benutzer Aktien das Bild (speziell aus dem Download-Manager) mit meiner Tätigkeit (UploadActivity), prüft die Aktivität, wenn der Benutzer angemeldet ist. Wenn nicht, wird es die ursprüngliche Absicht speichern (mit EXTRA_STREAM) und senden Sie den Benutzer an die LoginActivity. Sobald dieser Benutzer angemeldet ist, wird er mit der ursprünglichen gespeicherten Absicht zu UploadActivity zurückgebracht.

Nun, auch nach dem Wiederherstellen der ursprünglichen Absicht, bekomme ich eine java.lang.SecurityException: Permission Denial: reading com.android.providers.downloads.DownloadProvider uri....

Ich verstehe, warum ich das bekomme. Es ist, weil ich nicht die vorübergehende Erlaubnis habe, die die ursprüngliche Absicht hatte.

Edit: LogCat

FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.UploadActivity}: java.lang.SecurityException: Permission Denial: reading com.android.providers.downloads.DownloadProvider uri content://downloads/all_downloads/1145 from pid=16585, uid=10086 requires android.permission.ACCESS_ALL_DOWNLOADS, or grantUriPermission() 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
    at android.app.ActivityThread.access$600(ActivityThread.java:141) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:5041) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.downloads.DownloadProvider uri content://downloads/all_downloads/1145 from pid=16585, uid=10086 requires android.permission.ACCESS_ALL_DOWNLOADS, or grantUriPermission() 
    at android.os.Parcel.readException(Parcel.java:1425) 
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185) 
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137) 
    at android.content.ContentProviderProxy.query(ContentProviderNative.java:366) 
    at android.content.ContentResolver.query(ContentResolver.java:372) 
    at android.content.ContentResolver.query(ContentResolver.java:315) 
    at com.example.UploadActivity.getFileFromContentUri(UploadActivity.java:304) 
    at com.example.UploadActivity.onCreate(UploadActivity.java:195) 
    at android.app.Activity.performCreate(Activity.java:5104) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
    ... 11 more 
+0

Bitte posten Sie alle LogCat-Fehler. Um sicher zu sein, haben Sie die INTERNET-Erlaubnis? – Sam

+0

Der ursprüngliche Post wurde aktualisiert. Ja, ich habe die INTERNET-Erlaubnis. Es ist die einzige Erlaubnis, die ich habe. – ademers

+0

@AWebDevDuh: Sie haben auch 'android.permission.ACCESS_ALL_DOWNLOADS' Erlaubnis hinzugefügt? –

Antwort

0

Bitte senden Sie Ihren vollständigen Code für die Contentprovider abfragt. Ich hatte ein ähnliches Problem. beim Aufruf eines Cursors mit:

c=MyApplication.getAppContext().getContentResolver().query(uri,null,null,null,null); 

aber wenn ich die Projektion auf

gesetzt
String[] proj=new String[] { 
       MediaStore.MediaColumns.DATA, 
       MediaStore.MediaColumns.DISPLAY_NAME, 
     }; 
c=MyApplication.getAppContext().getContentResolver().query(uri,proj,null,null,null); 

es funktioniert. Sobald ich die Projektion MediaStore.MediaColumns.MIME_TYPE hinzufüge, schlägt es erneut fehl. Es scheint mir, dass der Anbieter keinen Zugang zu dieser (und vielleicht einer anderen) Spalte gewährt.

+0

Gut, nachdem ich dies eine Weile getestet habe, habe ich den Eindruck, dass dies nur ein erster Schritt ist. Mit dem MediaStore.MediaColumns.MIME_TYPE mimeType erhalte ich ständig Exceptions, aber ohne es bekomme ich immer noch SecurityExceptions von Zeit zu Zeit. Vielleicht wird die Erlaubnis nach einiger Zeit widerrufen? Je länger ich im Debug-Modus sitze, desto wahrscheinlicher scheint eine Ausnahme bei der nächsten Abfrage zu sein. Wenn ich einen einzelnen Uri von einem "ACTION_SEND" semms abrufe, um zu arbeiten, aber mehrere Uris von "ACTION_SEND_MULTIPLE" abfragt, verursacht das von Zeit zu Zeit einige Probleme. –

+0

Ich habe den gleichen Stolperstein getroffen - manchmal kann ich auf den Inhaltsstrom zugreifen, zu anderen Zeiten bekomme ich SecurityException, identische Datei usw. Haben Sie mehr über dieses Problem erfahren? – gregko

Verwandte Themen