将Uri从ACTION_GET_CONTENT通过活动传递给服务

时间:2017-02-20 07:22:34

标签: android android-intent android-service

我有一个简单的应用程序,允许用户将数据上传到我的服务。用户通过发起ACTION_GET_CONTENTACTION_IMAGE_CAPTURE或通过接收ACTION_SEND来指定一个或多个文件。来自getParcleableExtragetParcleableArrayListExtra的Uri将添加到UploadActivity中的数组中,其中接收get / capture / send意图。一些Uris使用ContentResolver.openInputStream(Uri)或各种游标打开以获取元数据。这成功没有任何错误。当用户想要上传文件时,Uris会添加到使用putParcleableArrayListExtra启动UploadService的intent中。然后调用startServicefinish(),关闭活动。 UploadService是IntentService,它通过HTTP上传文件。所有Uris都打开了Cursors查询进度条的大小。然后,它们将再次以openInputStream打开,然后上传到服务器。

这只适用于1 Uri。如果我有超过1个Uri,openInputStream会抛出SecurityException:

java.lang.SecurityException: Permission Denial: reading com.android.externalstorage.ExternalStorageProvider uri content://com.android.externalstorage.documents/document/primary%3Aempty.txt from pid=6062, uid=10300 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()
        at android.os.Parcel.readException(Parcel.java:1627)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
        at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:146)
        at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:692)
        at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1111)
        at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:948)
        at android.content.ContentResolver.openInputStream(ContentResolver.java:668)
        at tk.mii8303.yumeko.YetAnotherURI$OtherURI.Open(YetAnotherURI.java:73)
        at tk.mii8303.yumeko.UploadService.onHandleIntent(UploadService.java:119)
        at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:66)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:234)
        at android.os.HandlerThread.run(HandlerThread.java:61)

如果我已经在我的应用程序中早先在文件上调用了相同的方法并且成功了,我就不明白为什么我需要MANAGE_DOCUMENTS。 我试过打电话

takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
grantUriPermission("tk.mii8303.yumeko.UploadService", uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

每个Uri之前,他们的意图无济于事。

如何将Uris及其权限传递给我的服务?

0 个答案:

没有答案