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
相关产品推荐
相关产品推荐

