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

Flutter无法在Documents文件夹外创建新文件的问题求助

解决Android 13下Flutter写入非默认目录权限问题

核心原因

Android 13(API 33)对存储权限机制做了大幅调整:

  • 传统的WRITE_EXTERNAL_STORAGE权限已被废弃,系统会自动忽略该权限的申请
  • 仅特定媒体目录(DCIM、Pictures、Movies等)需要申请对应媒体权限;自定义目录或非媒体目录则需通过**存储访问框架(SAF)**获取权限,或申请MANAGE_EXTERNAL_STORAGE权限后者仅适用于特定场景

具体解决方案

方案1:使用存储访问框架(SAF)推荐

file_picker支持通过SAF获取目录的持久化写入权限,无需申请危险权限,操作步骤如下:

  1. 修改file_picker调用逻辑,启用SAF相关配置:
String? selectedDir = await FilePicker.platform.getDirectoryPath(
  dialogTitle: '选择存储目录',
  lockParentWindow: true,
  withData: false, // 启用SAF模式获取目录权限
);
  1. 拿到目录路径后,不要直接用File类创建文件,需通过SAF的Uri进行文件操作。可借助flutter_file_dialog包简化文件创建流程,或直接基于SAF的API实现写入逻辑。

方案2:申请MANAGE_EXTERNAL_STORAGE权限仅适用于文件管理器类应用

若你的应用确实需要全存储访问权限,需按以下步骤操作:

  1. 在AndroidManifest.xml中添加权限声明:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
    android:minSdkVersion="30" />
  1. 通过permission_handler申请权限:
var status = await Permission.manageExternalStorage.request();
if (status.isGranted) {
  // 执行文件写入操作
}

注意:该权限需用户手动到应用设置中开启,且Google Play对使用此权限的应用审核严格,非必要不建议采用。

方案3:针对媒体目录的适配

若仅需写入DCIM这类媒体目录,Android 13无需单独申请写入权限,只需添加对应媒体读取权限:

  1. 在AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
  1. 使用permission_handler申请上述媒体权限后,即可正常写入DCIM等媒体目录。

额外注意事项

  • 彻底放弃依赖WRITE_EXTERNAL_STORAGE权限,Android 13+已完全忽略该权限
  • 优先采用SAF方式,这是Android官方推荐的存储访问方案,可避免权限限制问题
  • 测试时需确保模拟器的Android 13系统已正确授予权限,部分模拟器可能需要手动刷新权限状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:52:15