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

Flutter Camera插件应用后台恢复后崩溃问题排查

应用从后台恢复后Flutter Camera插件崩溃问题

问题详情

使用Flutter Camera插件时,应用从后台恢复后出现崩溃,错误发生在尝试启动相机流的过程中。当前实现逻辑:

  • 在StatefulWidget的initState方法中初始化相机
  • 通过didChangeAppLifecycleState处理相机的暂停与恢复
  • 使用CameraController启动实时流并处理相机图像
  • 通过didPopNext方法在返回页面时恢复相机feed

使用的包版本:

camera: ^0.10.6

当前实现代码

@override
void initState() {
  super.initState();
  WidgetsBinding.instance.addObserver(this);
  _initializeCamera();
}

Future<void> _initializeCamera() async {
  await _viewModel.initialize(widget.initialCameraLensDirection, context);
  if (!_viewModel.isCameraInitialized) {
    await _viewModel.initialize(widget.initialCameraLensDirection, context);
  }
}

@override
void dispose() {
  WidgetsBinding.instance.removeObserver(this);
  _viewModel.stopLiveFeed(); // Ensure live feed is stopped properly
  super.dispose();
  _viewModel.customPaint = null;
}

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
  super.didChangeAppLifecycleState(state);
  if (state == AppLifecycleState.paused) {
    _viewModel.pauseLiveFeed();
  } else if (state == AppLifecycleState.resumed) {
    _viewModel.resumeLiveFeed();
  }
}

@override
void didPopNext() {
  super.didPopNext();
  if (!_viewModel.isDisposed) {
    _viewModel.resumeLiveFeed();
  }
}

错误日志

/Camera  (10294): refreshPreviewCaptureSession
I/Camera  (10294): CameraCaptureSession onClosed
W/System  (10294): A resource failed to call release. 
I/Camera  (10294): open | onError
I/Camera  (10294): close
W/CameraManagerGlobal(10294): ignore the torch status update of camera: 21
W/CameraManagerGlobal(10294): ignore the torch status update of camera: 22
W/CameraManagerGlobal(10294): ignore the torch status update of camera: 23
I/BufferQueueProducer(10294): [ImageReader-1280x720f100m1-10294-0](id:283600000001,api:4,p:719,c:10294) disconnect(): api=4
W/CameraManagerGlobal(10294): ignore the torch status update of camera: 61
I/BufferQueueProducer(10294): [SurfaceTexture-0-10294-0](id:283600000000,api:4,p:719,c:10294) disconnect(): api=4
E/CameraManagerGlobal(10294): Camera 61 is not available. Ignore physical camera status change
I/BufferQueueConsumer(10294): [ImageReader-1280x720f100m1-10294-0](id:283600000001,api:0,p:-1,c:10294) disconnect()
I/BufferQueueConsumer(10294): [ImageReader-1280x720f23m1-10294-1](id:283600000002,api:0,p:-1,c:10294) disconnect()
I/Camera  (10294): open | onClosed
2
V/PhoneWindow(10294): DecorView setVisiblity: visibility = 0, Parent = android.view.ViewRootImpl@6bb8edc, this = DecorView@d8b0be5[MainActivity]
I/mali_config(10294): @get_buffer_dataspace_setting: update dataspace (0x10010000 -> 0x08020000)
E/MethodChannel#plugins.flutter.io/camera_android(10294): Failed to handle method call
E/MethodChannel#plugins.flutter.io/camera_android(10294): java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Surface android.media.ImageReader.getSurface()' on a null object reference
E/MethodChannel#plugins.flutter.io/camera_android(10294):   at io.flutter.plugins.camera.Camera.startCapture(Camera.java:615)
E/MethodChannel#plugins.flutter.io/camera_android(10294):   at io.flutter.plugins.camera.Camera.startPreviewWithImageStream(Camera.java:1210)
E/MethodChannel#plugins.flutter.io/camera_android(10294):   at io.flutter.plugins.camera.MethodCallHandlerImpl.onMethodCall(MethodCallHandlerImpl.java:259)
E/MethodChannel#plugins.flutter.io/camera_android(10294):   at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:267)
E/MethodChannel#plugins.flutter.io/camera_android(10294):   at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:292)
E/MethodChannel#plugins.flutter.io/camera_android(10294):   at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:319)
E/MethodChannel#plugins.flutter.io/camera_android(10294):   at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(Unknown Source:12)
E/MethodChannel#plugins.flutter.io/camera_android(10294):   at android.os.Handler.handleCallback(Handler.java:938)
E/MethodChannel#plugins.flutter.io/camera_android(10294):   at android.os.Handler.dispatchMessage(Handler.java:99)
E/MethodChannel#plugins.flutter.io/camera_android(10294):   at android.os.Looper.loop(Looper.java:236)
E/MethodChannel#plugins.flutter.io/camera_android(10294):   at android.app.ActivityThread.main(ActivityThread.java:7864)
E/MethodChannel#plugins.flutter.io/camera_android(10294):   at java.lang.reflect.Method.invoke(Native Method)
E/MethodChannel#plugins.flutter.io/camera_android(10294):   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:620)
E/MethodChannel#plugins.flutter.io/camera_android(10294):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1011)
E/flutter (10294): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: PlatformException(error, Attempt to invoke virtual method 'android.view.Surface android.media.ImageReader.getSurface()' on a null object reference, null, java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Surface android.media.ImageReader.getSurface()' on a null object reference
E/flutter (10294):  at io.flutter.plugins.camera.Camera.startCapture(Camera.java:615)
E/flutter (10294):  at io.flutter.plugins.camera.Camera.startPreviewWithImageStream(Camera.java:1210)
E/flutter (10294):  at io.flutter.plugins.camera.MethodCallHandlerImpl.onMethodCall(MethodCallHandlerImpl.java:259)
E/flutter (10294):  at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:267)
E/flutter (10294):  at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:292)
E/flutter (10294):  at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:319)
E/flutter (10294):  at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(Unknown Source:12)
E/flutter (10294):  at android.os.Handler.handleCallback(Handler.java:938)
E/flutter (10294):  at android.os.Handler.dispatchMessage(Handler.java:99)
E/flutter (10294):  at android.os.Looper.loop(Looper.java:236)
E/flutter (10294):  at android.app.ActivityThread.main(ActivityThread.java:7864)
E/flutter (10294):  at java.lang.reflect.Method.invoke(Native Method)
E/flutter (10294):  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:620)
E/flutter (10294):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1011)
E/flutter (10294): )
E/flutter (10294): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:648:7)
E/flutter (10294): #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:334:18)
E/flutter (10294): <asynchronous suspension>

解决方案

  • 将camera包更新至最新版本,注意新版本移除了内置的yuv420toNV21转换逻辑,需要自行实现该转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:28:10