Android 11无需MANAGE_EXTERNAL_STORAGE打开自定义扩展名文件的方法
解决方案
方案1:修复系统文档选择器(ACTION_OPEN_DOCUMENT)配置
你当前代码仅指定text/plain类型,系统会自动过滤所有不匹配标准文本扩展名的文件,导致自定义后缀文件置灰,按以下方式修改即可:
- 多MIME类型兜底+高版本扩展名匹配
对应代码修改如下:Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); // 基础类型设为任意文件,后续做过滤限制 intent.setType("*/*"); // 加入文本类型和二进制流类型兜底,覆盖未知扩展名的识别场景 intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[]{"text/plain", "application/octet-stream"}); // Android 13及以上可直接指定允许的扩展名,系统会自动过滤展示 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { intent.putExtra(Intent.EXTRA_ALLOWED_EXTENSIONS, new String[]{"cave", "svx", "th"}); } - 修复
EXTRA_INITIAL_URI不生效问题
系统仅对已获得持久化授权的URI生效,你需要在之前用户选中对应目录时,调用以下代码获取长期访问权限:
首次启动无授权记录时,系统默认跳转「最近文件」是正常行为,无法绕过。getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
方案2:自定义文件选择列表(全版本适配)
如果需要更低版本的适配,或者想要完全控制文件筛选逻辑,可以用存储访问框架的目录授权能力实现:
- 发起
ACTION_OPEN_DOCUMENT_TREEintent,引导用户授权你需要访问的根目录 - 拿到目录URI后,通过
DocumentsContractAPI遍历该目录下的所有文件,自行筛选后缀为.cave/.svx/.th的文件 - 在应用内实现列表UI供用户选择,完全不需要申请敏感存储权限,完全符合Google Play审核规则
额外注意事项
拿到选中文件的URI后,不要尝试转成本地File路径读取,使用getContentResolver().openInputStream(uri)读取文本内容即可,适配所有SAF返回的URI格式。
内容的提问来源于stack exchange,提问作者Pauline
相关产品推荐
相关产品推荐

