Android 10下ACTION_OPEN_DOCUMENT选图功能异常问题咨询
问题原因分析
Android 10(API 29)引入了分区存储特性,默认情况下应用仅可访问自身专属目录、以及自身创建的媒体库文件,默认配置的ACTION_OPEN_DOCUMENT受权限规则限制,就会出现相机目录图片不展示、下载目录图片不可选中的问题。
排查步骤
- 确认应用的
targetSdkVersion是否≥29,分区存储仅在targetSdk≥29时默认生效 - 检查是否申请了公共存储读取权限:Android 10上仍需要
READ_EXTERNAL_STORAGE权限才能访问公共目录的媒体文件 - 确认调用
ACTION_OPEN_DOCUMENT时是否添加了正确的参数,默认配置下系统会限制可选文件的范围
解决方案
方法1:修改Intent配置(最优适配方案)
补充必要的Category和Flag参数即可拓展可选文件范围,修改后的代码如下:
Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT); i.setType("image/*"); // 仅筛选可直接读取的文件,解决下载目录文件不可选问题 i.addCategory(Intent.CATEGORY_OPENABLE); // 申请选中文件的读取权限 i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivityForResult(i, Constants.REQUEST_PICK_FILE);
选图完成后通过ContentResolver.openInputStream()读取返回URI对应的文件流即可,不要尝试直接访问文件的绝对路径。
方法2:临时兼容方案(仅适用Android 10,不推荐长期使用)
如果暂时不需要适配分区存储,可以在AndroidManifest.xml的application节点添加android:requestLegacyExternalStorage="true"属性,关闭分区存储特性,回退到Android 9及之前的存储权限模型,即可正常访问所有公共目录文件。
内容的提问来源于stack exchange,提问作者Abraham Mathew
相关产品推荐
相关产品推荐

