targetSdk36应用READ_MEDIA_VISUAL_USER_SELECTED权限下旧安装图片访问问题
部分媒体权限下读取自创建图片的解决方案
在targetSdk 36(对应Android 14)的**部分媒体访问权限(READ_MEDIA_VISUAL_USER_SELECTED)**模式下,你遇到的自创建图片无法读取的问题,是Android 14权限设计的明确规则导致的,以下是具体说明和可行方案:
核心权限逻辑
READ_MEDIA_VISUAL_USER_SELECTED仅授予对用户通过系统界面明确选择的媒体的访问权,但这个权限不包含"应用自身创建但未通过照片选择器重新授权的外部媒体"。即使是你应用生成的DCIM/<appName>/photo.jpg,系统在部分权限模式下会将其视为普通外部媒体,而非应用私有资源,因此直接通过MediaStore URI或文件路径访问会被权限拦截。
可行的读取方案(无需完整READ_MEDIA_IMAGES权限)
- 使用照片选择器(Photo Picker):这是官方推荐的合规方式。通过
ACTION_PICK_IMAGESIntent唤起系统照片选择器,用户选中目标图片后,你可以直接使用返回的URI调用contentResolver.openInputStream()读取,不受部分权限限制,也不需要额外申请权限。 - 针对新创建媒体优化存储路径:如果是后续新生成的图片,将其存储到应用私有外部目录(如
getExternalFilesDir(Environment.DIRECTORY_DCIM)),这类目录下的文件属于应用私有资源,即使在部分权限模式下,应用也能直接通过文件路径或MediaStore访问,但旧版本已创建的图片无法修改存储属性,无法通过此方式回溯解决。
用户手动选择的局限性
系统权限设置中的"选择照片"UI,仅用于定义READ_MEDIA_VISUAL_USER_SELECTED权限覆盖的媒体范围,但无法突破系统对"应用自创建外部媒体"的权限判定。因此即使用户在该界面选中了目标图片,应用依然无法通过MediaStore查询或直接文件路径访问,必须通过照片选择器的流程获取合法的访问授权。
内容的提问来源于stack exchange,提问作者Artavazd Khachatryan
相关产品推荐
相关产品推荐

