调用takePersistableUriPermission访问云端存储本地缓存文件的权限问题
takePersistableUriPermission对云端缓存类相册文件的访问规则说明 核心问题结论
- 调用
takePersistableUriPermission获取的持久化URI权限,本质是系统授予你的应用跨进程访问对应ContentProvider所暴露资源的资格,不保证目标资源始终在本地可用。 - 针对Google Photos这类云端存储、仅在本地留存临时缓存的相册场景:即使你成功拿到了对应照片的持久化URI访问权限,后续若Google Photos清理了该照片的本地缓存,你的应用将无法正常读取该文件——此时你持有的权限本身没有失效,但提供URI的Google Photos端本地已无对应文件,也不会自动在后台拉取云端资源供你读取,调用
ContentResolver.openInputStream()等读取接口时会直接抛出文件不存在的异常。 - 实现用户选图作为应用背景的稳妥方案:用户选中图片后,立刻通过拿到的URI读取文件流,将图片拷贝到应用自身的私有存储目录,后续直接读取私有目录下的文件即可,不要长期依赖第三方应用返回的URI访问资源。
持久化URI使用的关键注意点
- 单应用可持有的持久化URI权限存在系统上限
很长一段时间内该上限为128个,Android 11将上限提升至512个,Android 12版本的上限同样为512个。
对于不再需要使用的URI权限,开发者应当主动释放,避免触达上限后无法获取新的资源访问权限,释放权限的示例代码如下:
final int releaseFlags = intent.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); getContentResolver().releasePersistableUriPermission(fileUri, releaseFlags);
- URI所属应用可主动撤销访问权限
除了系统的数量限制、资源本地不存在的场景外,提供URI的第三方应用随时可以通过revokeUriPermission接口,撤销外部应用对对应URI的访问权限,权限撤销后后续的资源读取请求会直接失败。
内容的提问来源于stack exchange,提问作者Lifes
相关产品推荐
相关产品推荐

