2013-03-05 91 views
5

我有一个活动,意图过滤器android.intent.action.SEND与图片MIME类型。访问DownloadProvider时避免SecurityException

一旦用户共享照片(专门从下载管理器)与我的活动(UploadActivity),活动将检查用户是否登录。如果不是,它将存储原意(与EXTRA_STREAM)并将用户发送到LoginActivity。一旦该用户登录,他将以原始保存的意图被带回到UploadActivity。

现在,即使恢复原来的意图后,我得到一个java.lang.SecurityException: Permission Denial: reading com.android.providers.downloads.DownloadProvider uri...

我明白为什么我会得到这个。这是因为我没有原始意图的临时许可。

编辑: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

请发布所有的LogCat错误。可以肯定的是,你有'INTERNET'权限吗? – Sam 2013-03-05 17:40:41

+0

原始帖子已更新。是的,我拥有“INTERNET”权限。这是我拥有的唯一权限。 – ademers 2013-03-05 17:51:00

+0

@AWebDevDuh:你还添加了'android.permission.ACCESS_ALL_DOWNLOADS'权限? – 2013-03-05 17:52:22

回答

0

请发表您的查询ContentProvider的全部代码。我有类似的问题。 调用光标时:

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

然而,当我在设定投影

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

它的工作原理。只要我将MediaStore.MediaColumns.MIME_TYPE添加到投影中,它就会再次失败。在我看来,提供者不允许访问这个(也可能是其他)列。

+0

好吧,经过一段时间的测试后,我觉得这只是第一步。随着MediaStore.MediaColumns.MIME_TYPE mimeType我不断得到例外,但没有它,我仍然不时地得到SecurityExceptions。也许许可在一段时间后被撤销?我坐在调试模式下的时间越长,下一个查询的异常就越可能发生。对于我来说,从“ACTION_SEND”semms查询单个Uri工作,但从“ACTION_SEND_MULTIPLE”查询多个Uris仍然会不时地产生一些麻烦。 – 2014-03-11 09:48:29

+0

我碰到同样的绊脚石 - 有时我可以访问内容流,在其他时间我得到SecurityException,相同的文件等。你有没有更多地了解这个问题? – gregko 2014-09-30 23:20:29

相关问题