You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 16:09:09