Avoid SecurityException When Accessing DownloadProvider

I have an activity that has an intent filter android.intent.action.SENDwith an image type.

After the user shares the image ( especially from the download manager ) with my activity (UploadActivity), the action checks if the user is logged in. If not, it will keep the original intention (with EXTRA_STREAM) and send the user to LoginActivity. As soon as this user logs in, he will be returned to UploadActivity with the original intent saved.

Now, even after the restoration of the original intention, I get java.lang.SecurityException: Permission Denial: reading com.android.providers.downloads.DownloadProvider uri....

I understand why I understand this. This is because I do not have a temporary permit, which had the original intention.

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
+5
source share
1 answer

Please post the full code for the ContentProvider request. I had a similar problem. when calling the cursor with:

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

however, when I set the projection to

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

it works. As soon as I add MediaStore.MediaColumns.MIME_TYPEto the projection, it will work again. It seems to me that the provider does not provide access to this (and possibly another) column.

0
source

All Articles