Flutter获取Android手机DCIM/Camera目录文件失败求助
解决Flutter读取Android DCIM/Camera目录无文件返回的问题
1. 检查并申请正确的权限
Android 10(API 29)开始引入分区存储,Android 13(API 33)进一步细化了媒体权限:
- Android 13+需申请
READ_MEDIA_IMAGES和READ_MEDIA_VIDEO权限 - Android 10-12需申请
READ_EXTERNAL_STORAGE权限
在AndroidManifest.xml中添加权限声明:
<!-- Android 13+ --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <!-- Android 10-12 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
用permission_handler包动态申请权限:
import 'package:permission_handler/permission_handler.dart'; Future<bool> requestMediaPermissions() async { PermissionStatus status; if (await Permission.mediaLibrary.isGranted) { return true; } else { status = await Permission.mediaLibrary.request(); return status.isGranted; } }
调用文件读取方法前先确认权限:
if (await requestMediaPermissions()) { await getCameraDirectoryFiles(); }
2. 修正目录路径处理逻辑
不要直接用+拼接路径,用path包的join方法避免分隔符错误:
import 'package:path/path.dart' as path; // ... String galleryPath = path.join(path, 'Camera');
同时先检查目录是否存在:
Directory directory = Directory(galleryPath); if (!directory.existsSync()) { print('Camera目录不存在'); return; }
3. 适配分区存储,改用MediaStore读取
Android 10+的分区存储限制了直接访问公共目录的能力,更可靠的方式是通过系统媒体库查询:
import 'package:media_store/media_store.dart'; Future<List<String>> getAllMediaFiles() async { List<String> paths = []; // 查询图片 List<MediaStoreFile> images = await MediaStore.getImages( sortBy: MediaStoreSortBy.dateModified, order: MediaStoreOrder.desc, ); paths.addAll(images.map((e) => e.path)); // 查询视频 List<MediaStoreFile> videos = await MediaStore.getVideos( sortBy: MediaStoreSortBy.dateModified, order: MediaStoreOrder.desc, ); paths.addAll(videos.map((e) => e.path)); return paths; }
这种方式无需关心具体存储路径,兼容性更强。
4. 验证Camera目录实际位置
部分定制ROM的照片可能存在Pictures/Camera等其他目录,先打印路径确认:
print('Camera目录路径:$galleryPath');
再手动在文件管理器中检查该路径是否有照片。
内容的提问来源于stack exchange,提问作者Deeps
相关产品推荐
相关产品推荐

