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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:07:54