最近在写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老皮!!!欢迎大家来找我探讨交流👀