我有一个简单的应用程序,允许用户将数据上传到我的服务。用户通过发起ACTION_GET_CONTENT
或ACTION_IMAGE_CAPTURE
或通过接收ACTION_SEND
来指定一个或多个文件。来自getParcleableExtra
或getParcleableArrayListExtra
的Uri将添加到UploadActivity中的数组中,其中接收get / capture / send意图。一些Uris使用ContentResolver.openInputStream(Uri)
或各种游标打开以获取元数据。这成功没有任何错误。当用户想要上传文件时,Uris会添加到使用putParcleableArrayListExtra
启动UploadService的intent中。然后调用startService
和finish()
,关闭活动。 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及其权限传递给我的服务?