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

Flutter:使用image_picker拍照点击确定后应用崩溃问题

问题:image_picker相机拍照后应用直接返回主页(仅单台Poco X3 Android 10设备触发)
  • 依赖包:image_picker
  • 现象:调用相机捕获图片,点击预览页“确定”后,应用直接退回主页,无任何错误日志输出
  • 前置确认:相机、媒体存储权限已授予,现有错误捕获逻辑未生效

问题分析

你的代码存在await与then混用的异步逻辑冲突:await会等待pickImage执行完成,但后续的then会单独触发异步回调,导致pickedFile的赋值和后续事件添加逻辑执行顺序混乱,部分异常可能跳出了现有捕获范围。另外单台设备出现问题,大概率和该设备的相机配置、系统缓存或依赖版本兼容性有关。


修复方案

1. 重构异步代码,统一使用await写法

移除混用的then和onError,改用纯await+try/catch覆盖所有流程,确保异常能被正确捕获:

try {
  var _picker = ImagePicker();
  XFile? pickedFile = await _picker.pickImage(
    source: ImageSource.camera,
  );
  
  if (pickedFile != null) {
    bloc.emit(ShowToastState(file: pickedFile));
    bloc.add(ProfileScreenProfileChangeEvent(
      pickedFile,
      ImageSource.camera,
    ));
  } else {
    // 处理用户取消拍照的场景
    bloc.emit(ShowToastState(msg: "已取消拍照"));
  }
} catch (e, stackTrace) {
  bloc.emit(ShowToastState(msg: e.toString()));
  handleCameraPermissionError(context, e);
  // 强制打印堆栈信息,方便排查单设备问题
  print("相机拍照异常:$e,堆栈跟踪:$stackTrace");
}

2. 单台设备专属排查步骤

  • 清除应用的缓存和存储数据,重启应用后重新测试
  • 检查该设备的系统相机是否能正常工作,尝试更新系统或相机应用至最新版本
  • 确认image_picker依赖版本是否适配Android 10,可尝试升级到最新稳定版,或回退至已知兼容的旧版本
  • 用Android Studio的Logcat过滤该应用日志,即使无崩溃提示,底层可能存在文件存储、相机进程相关的警告/错误信息

3. 补充AndroidManifest适配配置

针对Android 10,确保AndroidManifest.xml中添加以下配置:

<!-- Android 10及以上媒体权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<application
    ...
    android:requestLegacyExternalStorage="true">
    ...
</application>

内容的提问来源于stack exchange,提问作者MAHALAKSHMI S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 22:12:23