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

Flutter Camera插件takePicture与startImageStream崩溃问题求助

问题:Flutter Camera插件调用takePicture时崩溃

在Flutter应用中使用Camera插件调用设备相机并捕获图片,每次调用takePicture时应用都会崩溃,问题关联takePicture、startImageStream及CameraController方法,同时正在使用Google ML Kit,不确定是否存在关联。

错误日志

E/AndroidRuntime( 3547): Process: com.example.pose_detection_app_v3, PID: 3547
E/AndroidRuntime( 3547): java.lang.IllegalArgumentException: CaptureRequest contains unconfigured Input/Output Surface!
E/AndroidRuntime( 3547):        at android.hardware.camera2.CaptureRequest.convertSurfaceToStreamId(CaptureRequest.java:739)
E/AndroidRuntime( 3547):        at android.hardware.camera2.impl.CameraDeviceImpl.submitCaptureRequest(CameraDeviceImpl.java:1243)
E/AndroidRuntime( 3547):        at android.hardware.camera2.impl.CameraDeviceImpl.capture(CameraDeviceImpl.java:1115)
E/AndroidRuntime( 3547):        at android.hardware.camera2.impl.CameraCaptureSessionImpl.capture(CameraCaptureSessionImpl.java:189)
E/AndroidRuntime( 3547):        at io.flutter.plugins.camera.Camera.takePictureAfterPrecapture(Camera.java:664)
E/AndroidRuntime( 3547):        at io.flutter.plugins.camera.Camera.onConverged(Camera.java:223)
E/AndroidRuntime( 3547):        at io.flutter.plugins.camera.CameraCaptureCallback.handleWaitingFocusState(CameraCaptureCallback.java:150)
E/AndroidRuntime( 3547):        at io.flutter.plugins.camera.CameraCaptureCallback.process(CameraCaptureCallback.java:108)
E/AndroidRuntime( 3547):        at io.flutter.plugins.camera.CameraCaptureCallback.onCaptureProgressed(CameraCaptureCallback.java:161)
E/AndroidRuntime( 3547):        at android.hardware.camera2.impl.CameraCaptureSessionImpl$1.lambda$onCaptureProgressed$2$CameraCaptureSessionImpl$1(CameraCaptureSessionImpl.java:679)
E/AndroidRuntime( 3547):        at android.hardware.camera2.impl.CameraCaptureSessionImpl$1$$ExternalSyntheticLambda5.run(Unknown Source:8)
E/AndroidRuntime( 3547):        at android.os.Handler.handleCallback(Handler.java:938)
E/AndroidRuntime( 3547):        at android.os.Handler.dispatchMessage(Handler.java:99)

问题原因

Android的Camera2 API不允许同时处理实时图像流(startImageStream)和拍照请求(takePicture),两者会抢占相机的Surface资源,导致配置冲突,触发IllegalArgumentException。你的代码中启动了图像流用于ML Kit分析,同时直接调用takePicture,这就是崩溃的核心原因。

修复方案

调用takePicture前先停止图像流,拍照完成后重新启动图像流,确保相机资源不会冲突:

修改后的拍照方法代码

Future<void> _captureAndShowImage() async {
  if (_controller == null || !_controller!.value.isInitialized) {
    return;
  }

  try {
    // 1. 停止图像流,释放相机Surface资源
    await _controller!.stopImageStream();
    
    // 2. 执行拍照操作
    final directory = await getTemporaryDirectory();
    final path = '${directory.path}/${DateTime.now().millisecondsSinceEpoch}.jpg';
    final picture = await _controller!.takePicture();
    
    // 3. 保存图片到相册
    final result = await ImageGallerySaver.saveFile(picture.path);
    print('图片保存结果: $result');
  } catch (e) {
    print('拍照出错: $e');
  } finally {
    // 4. 重新启动图像流,恢复ML Kit分析
    if (mounted) {
      _controller!.startImageStream(_processCameraImage);
    }
  }
}

额外优化建议

  • 拍照过程中可以添加加载提示,避免用户重复点击触发冲突
  • 所有相机操作前检查Widget的挂载状态,防止空指针异常
  • 如果ML Kit分析逻辑耗时较长,可以在拍照前暂停分析任务,减少资源占用

内容的提问来源于stack exchange,提问作者Tom Cohen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:52:56