最近在写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;
}
}
暂时先写这么多,有错误的地方欢迎大家指正~~
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓
PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题