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

