I am encountering an issue with the Flutter camera plugin where my app crashes after it resumes from the background. The error occurs specifically when trying to start the camera stream.
I initialize the camera in the initState method of my StatefulWidget.
On app lifecycle changes, I pause and resume the camera feed.
I use CameraController to start the live feed and process camera images.
didChangeAppLifecycleState to handle pausing and resuming of the camera.
didPopNext to resume the camera feed when returning to the screen.
Package
camera: ^0.10.6
<code>@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();
}
}
</code>
<code>@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();
}
}
</code>
@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();
}
}
<code>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>
E/flutter (10294): #2 AndroidCamera._startPlatformStream (package:camera_android/src/android_camera.dart:344:5)
E/flutter (10294): <asynchronous suspension>
</code>
<code>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>
E/flutter (10294): #2 AndroidCamera._startPlatformStream (package:camera_android/src/android_camera.dart:344:5)
E/flutter (10294): <asynchronous suspension>
</code>
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>
E/flutter (10294): #2 AndroidCamera._startPlatformStream (package:camera_android/src/android_camera.dart:344:5)
E/flutter (10294): <asynchronous suspension>