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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:57:02