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

Android 11+无需MANAGE_EXTERNAL_STORAGE权限实现可访问文件读写

可行解决方案(无需MANAGE_EXTERNAL_STORAGE权限)

方案1:使用存储访问框架(SAF)让用户指定可访问位置

这是Google推荐的合规方案,完全不需要特殊权限,且文件能在文件管理器中可见:

  • 保存文件时,调用SAF的ACTION_CREATE_DOCUMENT Intent,引导用户选择保存位置(比如系统的「文档」「下载」目录,或者用户自定义的文件夹),用户选择后就能生成一个可被文件管理器访问的文件。
  • 读取文件时,调用ACTION_OPEN_DOCUMENT Intent让用户选择之前保存的文件,或者通过takePersistableUriPermission持久化URI权限,后续可直接访问该文件,无需每次让用户选择。
  • 核心代码示例:
    // 启动保存文件的Intent
    val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
        addCategory(Intent.CATEGORY_OPENABLE)
        type = "application/octet-stream" // 适配任意二进制文件,也可根据需求用text/plain等类型
        putExtra(Intent.EXTRA_TITLE, "my_key_file.dat") // 自定义文件名
    }
    startActivityForResult(intent, REQUEST_CODE_SAVE_FILE)
    
    处理返回结果后,拿到URI即可通过ContentResolver完成文件读写。

方案2:引导用户开启Android Data目录的访问权限

多数主流厂商的文件管理器(小米、三星、OPPO等)已支持手动开启「Android Data目录访问权限」,开启后用户就能看到Android/Data/你的包名/下的文件:

  • 在App内添加引导步骤:告诉用户打开系统文件管理器 → 找到「设置」或「更多」选项 → 开启「显示隐藏文件」或「Android Data访问权限」(不同厂商操作路径略有差异)。
  • 该方案无需修改App代码,但依赖用户操作,部分小众厂商的文件管理器可能不支持此功能。

方案3:添加手动导入/导出功能

在App内实现两个核心功能:

  • 导出:将关键文件通过ACTION_SEND Intent分享给用户,用户可选择保存到邮件、微信,或用SAF保存到公共目录。
  • 导入:调用ACTION_GET_CONTENT Intent让用户选择之前导出的文件,App读取后恢复关键信息。
  • 这个方案完全合规,用户可自主控制文件的备份和转移,非常适合你和朋友小范围使用的场景。

备选方案:利用Android自动备份功能

如果用户不需要直接看到文件,仅需换机时恢复数据,可开启Android自动备份:

  • 在AndroidManifest.xml中配置:
    <application
        ...
        android:allowBackup="true"
        android:fullBackupContent="@xml/backup_rules">
    </application>
    
  • 创建res/xml/backup_rules.xml,指定需要备份的文件路径,Google会自动备份App内部存储和App-specific目录内容,用户换机登录同一Google账号后会自动恢复。但用户无法直接访问备份文件,仅适合不需要手动复制文件的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:42:52