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

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:自定义文件选择列表(全版本适配)

如果需要更低版本的适配,或者想要完全控制文件筛选逻辑,可以用存储访问框架的目录授权能力实现:

  1. 发起ACTION_OPEN_DOCUMENT_TREE intent,引导用户授权你需要访问的根目录
  2. 拿到目录URI后,通过DocumentsContractAPI遍历该目录下的所有文件,自行筛选后缀为.cave/.svx/.th的文件
  3. 在应用内实现列表UI供用户选择,完全不需要申请敏感存储权限,完全符合Google Play审核规则

额外注意事项

拿到选中文件的URI后,不要尝试转成本地File路径读取,使用getContentResolver().openInputStream(uri)读取文本内容即可,适配所有SAF返回的URI格式。


内容的提问来源于stack exchange,提问作者Pauline

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:27:02