Flutter项目无法在设备内部存储创建目录 报FileSystemException异常
解决方案
1. 升级适配API 30的依赖版本
你当前使用的依赖版本过旧,未适配Android 11(API 30)的存储权限规则,需升级到以下最低兼容版本:
- path_provider: ^2.0.10
- permission_handler: ^8.3.0
如果后续需要获取设备系统版本判断权限逻辑,可额外引入device_info_plus: ^4.0.0依赖。
2. 修正权限申请逻辑
Android 11 起WRITE_EXTERNAL_STORAGE权限已被废弃,即使在清单文件中声明也不会被授予,需要根据使用场景调整逻辑:
- 若仅在应用私有目录下创建文件/目录,完全不需要申请任何存储权限,可直接跳过权限申请步骤
- 若需要访问公共存储区域(如DCIM、Download等系统公共目录),需要在AndroidManifest.xml中新增权限声明:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
同时动态申请对应权限:
import 'package:permission_handler/permission_handler.dart'; import 'package:device_info_plus/device_info_plus.dart'; Future<bool> checkStoragePermission() async { if (!Platform.isAndroid) return true; final sdkInt = (await DeviceInfoPlugin().androidInfo).version.sdkInt; if (sdkInt >= 30) { return await Permission.manageExternalStorage.request().isGranted; } else { return await Permission.storage.request().isGranted; } }
3. 使用合法路径创建目录
禁止使用/sdcard/xxx这类硬编码路径,必须通过path_provider获取系统合法路径后再拼接子目录,示例代码如下:
import 'package:path_provider/path_provider.dart'; import 'dart:io'; Future<Directory?> createMyDir() async { // 获取应用私有文档目录,无需存储权限 final rootDir = await getApplicationDocumentsDirectory(); // 也可以根据需求选择 getExternalStorageDirectory() 等其他路径 final targetDir = Directory("${rootDir.path}/my_custom_folder"); try { if (!await targetDir.exists()) { // recursive设为true会自动创建层级缺失的父目录 await targetDir.create(recursive: true); } return targetDir; } catch (e) { print("创建目录异常: $e"); return null; } }
4. 校验legacy存储配置
确认android:requestLegacyExternalStorage="true"确实添加在AndroidManifest.xml的<application>标签下,而非子标签中,该配置在targetSdkVersion=30时仍可正常生效,暂时规避分区存储限制。
内容的提问来源于stack exchange,提问作者NaanAvanAlla
相关产品推荐
相关产品推荐

