Flutter无法在Documents文件夹外创建新文件的问题求助
解决Android 13下Flutter写入非默认目录权限问题
核心原因
Android 13(API 33)对存储权限机制做了大幅调整:
- 传统的
WRITE_EXTERNAL_STORAGE权限已被废弃,系统会自动忽略该权限的申请 - 仅特定媒体目录(DCIM、Pictures、Movies等)需要申请对应媒体权限;自定义目录或非媒体目录则需通过**存储访问框架(SAF)**获取权限,或申请
MANAGE_EXTERNAL_STORAGE权限后者仅适用于特定场景
具体解决方案
方案1:使用存储访问框架(SAF)推荐
file_picker支持通过SAF获取目录的持久化写入权限,无需申请危险权限,操作步骤如下:
- 修改
file_picker调用逻辑,启用SAF相关配置:
String? selectedDir = await FilePicker.platform.getDirectoryPath( dialogTitle: '选择存储目录', lockParentWindow: true, withData: false, // 启用SAF模式获取目录权限 );
- 拿到目录路径后,不要直接用
File类创建文件,需通过SAF的Uri进行文件操作。可借助flutter_file_dialog包简化文件创建流程,或直接基于SAF的API实现写入逻辑。
方案2:申请MANAGE_EXTERNAL_STORAGE权限仅适用于文件管理器类应用
若你的应用确实需要全存储访问权限,需按以下步骤操作:
- 在
AndroidManifest.xml中添加权限声明:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="30" />
- 通过
permission_handler申请权限:
var status = await Permission.manageExternalStorage.request(); if (status.isGranted) { // 执行文件写入操作 }
注意:该权限需用户手动到应用设置中开启,且Google Play对使用此权限的应用审核严格,非必要不建议采用。
方案3:针对媒体目录的适配
若仅需写入DCIM这类媒体目录,Android 13无需单独申请写入权限,只需添加对应媒体读取权限:
- 在
AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
- 使用
permission_handler申请上述媒体权限后,即可正常写入DCIM等媒体目录。
额外注意事项
- 彻底放弃依赖
WRITE_EXTERNAL_STORAGE权限,Android 13+已完全忽略该权限 - 优先采用SAF方式,这是Android官方推荐的存储访问方案,可避免权限限制问题
- 测试时需确保模拟器的Android 13系统已正确授予权限,部分模拟器可能需要手动刷新权限状态
内容的提问来源于stack exchange,提问作者Melom
相关产品推荐
相关产品推荐

