如何正确通过URI设置ImageView?ROOM存储的URI二次加载报权限错误如何解决?
问题根因
你遇到的SecurityException是因为Android系统授予App的Content URI临时访问权限不会持久化留存,App进程重启、系统版本升级或权限刷新后,之前存储的媒体库URI权限就会失效,二次访问就会抛出无访问权限的异常。
解决方案
场景1:通过系统选择器(ACTION_OPEN_DOCUMENT/ACTION_GET_CONTENT等)获取的URI
- 获取到URI后第一时间申请持久化权限,在选图回调中执行以下代码:
// 申请读权限,需要写权限的话额外添加FLAG_GRANT_WRITE_URI_PERMISSION getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
- 需在AndroidManifest.xml中添加权限声明:
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
场景2:直接访问公共媒体库资源
- 根据设备系统版本动态申请对应存储权限:
- Android 13及以上:申请
READ_MEDIA_IMAGES权限 - Android 12及以下:申请
READ_EXTERNAL_STORAGE权限
权限申请通过后再加载URI即可正常访问。
- Android 13及以上:申请
通用兼容方案(推荐)
第一次拿到URI时,将对应图片拷贝到App私有目录(/data/data/包名/files/或缓存目录),后续存储私有目录的本地路径,直接加载本地文件即可,完全避开URI权限问题,兼容性最高。
崩溃规避优化
给你的加载逻辑添加异常捕获,避免权限失效时直接崩溃:
Uri uri = Uri.parse(simpleMessage.getUri()); try { imageView.setImageURI(uri); } catch (SecurityException e) { // 权限失效,加载默认占位图,可在此处追加重新选图引导逻辑 imageView.setImageResource(R.drawable.default_placeholder); }
内容的提问来源于stack exchange,提问作者The blank
相关产品推荐
相关产品推荐

