开发Flutter文件管理器的一些坑

1,085 阅读2分钟

最近在写Flutter项目时遇到了一个文件管理器功能,做一下记录,整理一些小坑。
1.引入的第三方库external_path

资源地址:https://pub.dev/packages/external_path
external_path: ^1.0.3 #获取文件夹路径

获取Android根目录路径,由于path是一个String数组,一般情况下取第0位就是root path

  static Future<Directory> getAndroidRootPath() async {
    var path = await ExternalPath.getExternalStorageDirectories();
    Directory directory = Directory(path[0]);
    return directory;
  }

2.将根目录path转为Directory,然后进行遍历。recursive代表是否递归遍历路径下所有子路径,默认是false,
建议不要使用true,如果递归根目录耗时太长

List<FileSystemEntity> list = directory.listSync(recursive: false);

3.可以根据FileSystemEntity的静态方法判断path是File还是Directory,之后自行处理对应逻辑

FileSystemEntity.isDirectorySync(path)
FileSystemEntity.isFileSync(path)

4.根据path获取扩展名,注意获取到的扩展名是包含'.'的,例如'.jpg'

import 'package:path/path.dart' as p; 导包
///获取文件扩展名
  static String getFileExtension(String path) {
    return p.extension(path);
  }

记录flutter文件管理的一些小坑,问题不大~
1.遍历Directory,命名文件夹下有图片,但是directory.listSync()却返回空数组

List<FileSystemEntity> list = directory.listSync();返回值是空数组

这个问题跟Android13 的权限管理有关,需要再AndroidManifest中加入,并且授权App访问图片权限

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

2.创建Directory或者file失败报错,OS Error: Read-only file system, errno = 30,
依然是权限问题,需要动态获取权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
//注意Android13要加上下边这一行
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>

在flutter代码中动态获取权限

///请求权限
Future<bool> requestPermission() async {
    bool isMore13 = await SystemUtil.isMoreAndroid13();
    bool storagePermission = isMore13 ? true : await Permission.storage.isGranted;
    bool manageExternal = isMore13 ? await Permission.manageExternalStorage.isGranted : true;

    if (!storagePermission) {
      storagePermission = await Permission.storage.request().isGranted;
    }

    if (!manageExternal) {
      manageExternal = await Permission.manageExternalStorage.request().isGranted;
    }

    bool isPermissionGranted = storagePermission && manageExternal;

    if (isPermissionGranted) {
      return true;
    } else {
      return false;
    }
  }

暂时先写这么多,有错误的地方欢迎大家指正~~

👀关注公众号:Android老皮!!!欢迎大家来找我探讨交流👀