Flutter使用Camerawesome拍照后图片无法保存到系统相册怎么办
Flutter Camerawesome拍照后图片不显示在系统相册问题排查
现有实现代码
final testDir = await Directory('${extDir.path}/test').create(recursive: true); final String filePath = '${testDir.path}/${DateTime.now().millisecondsSinceEpoch}.jpg'; await pictureController.takePicture(filePath); final file = File(filePath); print("==> hastakePhoto : ${file.exists()} | path : $filePath"); final img = imgUtils.decodeImage(file.readAsBytesSync()); print("==> img.width : ${img?.width} | img.height : ${img?.height}"); print("----------------------------------");
异常表现
拍照流程可正常执行,代码校验显示拍摄生成的文件真实存在,可正常解析读取图片宽高属性,应用已获取全部所需权限,但拍摄的图片未出现在设备系统相册中。
排查方向
- 存储路径问题:当前代码将图片保存在外部存储下自定义的
test子目录,系统媒体扫描器默认不会主动扫描非标准媒体目录、应用私有目录下的新增文件,这类目录下的文件不会自动出现在系统相册。 - 未触发系统媒体库刷新:仅将文件写入磁盘不会自动同步到系统相册,必须主动通知系统媒体服务扫描新增文件,否则相册无法识别到新写入的图片。
- 平台配置缺失:安卓分区存储规则适配不到位、iOS相册写入权限未配置,都会导致文件即使存在也无法同步到系统相册。
解决方案
- 调整存储路径:不要使用自定义的
extDir.path/test路径存储需要同步到相册的图片,安卓端优先存储到系统公共DCIM、Pictures目录,iOS端可先存储到应用临时目录后再执行相册写入操作。 - 主动触发系统媒体同步:
安卓端:拍摄完成后调用系统MediaScannerConnection接口,传入新生成的文件路径触发媒体扫描;也可以直接使用成熟的相册操作Flutter插件调用保存到相册的方法,插件内部会自动完成媒体扫描逻辑。
iOS端:拍摄完成后调用PHPhotoLibrary相关接口将图片写入系统相册,注意首次写入会触发权限弹窗,需要提前在Info.plist中配置NSPhotoLibraryAddUsageDescription权限描述。 - 校验平台权限配置:
安卓端:安卓13及以上版本确认已申请READ_MEDIA_IMAGES权限;安卓10及以上启用分区存储的场景下,无需申请已废弃的WRITE_EXTERNAL_STORAGE权限,通过系统媒体API写入公共目录即可;如果临时关闭分区存储适配,需要在AndroidManifest中配置android:requestLegacyExternalStorage="true"。
iOS端:确认Info.plist中已添加相册写入权限的描述字段,否则无法完成相册写入操作。 - 兜底校验:可以手动通过设备文件管理器找到代码中生成的
test目录下的图片,确认文件本身无损坏,排除文件异常导致相册过滤不显示的问题。
内容的提问来源于stack exchange,提问作者JayVDiyk
相关产品推荐
相关产品推荐

