M-W*_*eEh 5 android permission-denied android-contentprovider android-permissions
我使用以下命令启动图像选择器意图:
final Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
pickIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(intent, PICK_IMAGE);
Run Code Online (Sandbox Code Playgroud)
然后onActivityResult()我得到所有选择的图像的uris,并启动在后台运行的Jobs并上传这些图像(https://github.com/yigit/android-priority-jobqueue)。但是,如果我按后退按钮并退出活动,那么任何未启动的作业都无法在运行时访问选择的图像并引发异常:
java.lang.SecurityException:权限拒绝:未从uid 10123导出的ProcessRecord {...}(pid = 2407,uid = 10117)打开提供程序com.google.android.apps.photos.contentprovider.MediaContentProvider
发生这种情况的原因是,一旦活动完成,权限就会被撤销。根据文档https://developer.android.com/guide/topics/providers/content-provider-basics.html:
这些是对特定内容URI的权限,该权限将持续到接收它们的活动完成为止。
我的问题是,是否有解决方法?喜欢在应用程序级别获得许可?
有哪些替代方案可以解决此问题?一种快速的解决方案似乎是复制所有拾取的图像,然后上传它们,但这似乎是不得已的方法。
注意:尝试从 uri 获取文件名是错误的。不要这样做!内容提供者还可以共享任何文件中不存在的任意数据,否则文件名可能会产生误导。例如,content://downloads/some_secret_data可能指向不在downloads文件夹中的文件。
所以最好的办法是立即从内容提供者读取/复制数据,然后使用该数据做任何你想做的事情。就我而言,我正在上传它。
这就是我所做的,对我来说效果很好。如果有人有更好的解决方案,请分享。我有android.permission.READ_EXTERNAL_STORAGE这样当用户拿起我用具体的文件路径,而不是图像uri在返回小号onActivityResult()。为了检索文件路径,我使用了这个方便的类/sf/answers/1439142281/瞧!
| 归档时间: |
|
| 查看次数: |
10432 次 |
| 最近记录: |