用户在某个文件浏览器中选择/共享音频文件后,我尝试播放音频文件。为此,我使用过滤器意图,通过它我得到Uri的音频文件。基于Uri,我可以玩它。 MediaPlayer使用Uri打开FileDescriptor。
我存储了Uri,因此我可以在重新启动应用后使用它。它适用于所有文件浏览器,除了android的默认下载应用程序。如果我从下载应用程序打开文件,我会收到这样的Uri:
content://com.android.providers.downloads.documents/document/25 - on android 7
我可以玩。但是在应用程序重新启动后,我再也无法使用相同的uri了。我得到例外:
java.lang.SecurityException: Permission Denial:
opening provider com.android.providers.downloads.DownloadStorageProvider from
ProcessRecord{160760b 3618:com.sample/u0a71} (pid=3618, uid=10071)
requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS
来自docs关于此权限:
此权限仅应由平台文档请求 管理应用。此权限无法授予第三方应用。
这是否意味着应用只拥有文件的临时权限?这有什么解决方案吗?
答案 0 :(得分:1)
所以我发现发件人应用只使用这些标志FLAG_GRANT_WRITE_URI_PERMISSION
和FLAG_GRANT_READ_URI_PERMISSION
设置了临时权限。只有处理意图的活动处于活动状态,权限才有效。
所以至少要检测一下我用
if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION) == Intent.FLAG_GRANT_READ_URI_PERMISSION || (flags & Intent.FLAG_GRANT_WRTITE_URI_PERMISSION) == Intent.FLAG_GRANT_WRITE_URI_PERMISSION) {
//only temporary permission
}