[camera_web] Release the camera stream of each available video input device (#4621)
diff --git a/packages/camera/camera_web/CHANGELOG.md b/packages/camera/camera_web/CHANGELOG.md
index 4ac140e..cfb980a 100644
--- a/packages/camera/camera_web/CHANGELOG.md
+++ b/packages/camera/camera_web/CHANGELOG.md
@@ -1,5 +1,6 @@
-## NEXT
+## 0.2.1+2
+* Fixes cameraNotReadable error that prevented access to the camera on some Android devices when initializing a camera.
* Implemented support for new Dart SDKs with an async requestFullscreen API.
## 0.2.1+1
diff --git a/packages/camera/camera_web/example/integration_test/camera_web_test.dart b/packages/camera/camera_web/example/integration_test/camera_web_test.dart
index 9749559..0943d7a 100644
--- a/packages/camera/camera_web/example/integration_test/camera_web_test.dart
+++ b/packages/camera/camera_web/example/integration_test/camera_web_test.dart
@@ -374,6 +374,37 @@
);
});
+ testWidgets(
+ 'releases the video stream '
+ 'of a video input device', (tester) async {
+ final videoDevice = FakeMediaDeviceInfo(
+ '1',
+ 'Camera 1',
+ MediaDeviceKind.videoInput,
+ );
+
+ final videoStream =
+ FakeMediaStream([MockMediaStreamTrack(), MockMediaStreamTrack()]);
+
+ when(mediaDevices.enumerateDevices).thenAnswer(
+ (_) => Future.value([videoDevice]),
+ );
+
+ when(
+ () => cameraService.getMediaStreamForOptions(
+ CameraOptions(
+ video: VideoConstraints(deviceId: videoDevice.deviceId),
+ ),
+ ),
+ ).thenAnswer((_) => Future.value(videoStream));
+
+ final _ = await CameraPlatform.instance.availableCameras();
+
+ for (var videoTrack in videoStream.getVideoTracks()) {
+ verify(videoTrack.stop).called(1);
+ }
+ });
+
group('throws CameraException', () {
testWidgets(
'with notSupported error '
diff --git a/packages/camera/camera_web/lib/src/camera_web.dart b/packages/camera/camera_web/lib/src/camera_web.dart
index 5fbd820..f183b78 100644
--- a/packages/camera/camera_web/lib/src/camera_web.dart
+++ b/packages/camera/camera_web/lib/src/camera_web.dart
@@ -163,6 +163,9 @@
cameras.add(camera);
camerasMetadata[camera] = cameraMetadata;
+
+ // Release the camera stream of the current video input device.
+ videoTracks.forEach((videoTrack) => videoTrack.stop());
} else {
// Ignore as no video tracks exist in the current video input device.
continue;
diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml
index c75183d..2839710 100644
--- a/packages/camera/camera_web/pubspec.yaml
+++ b/packages/camera/camera_web/pubspec.yaml
@@ -2,7 +2,7 @@
description: A Flutter plugin for getting information about and controlling the camera on Web.
repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_web
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
-version: 0.2.1+1
+version: 0.2.1+2
environment:
sdk: ">=2.12.0 <3.0.0"