diff --git a/packages/camera/camera_web/CHANGELOG.md b/packages/camera/camera_web/CHANGELOG.md index 6fb3e44569c..372808067e5 100644 --- a/packages/camera/camera_web/CHANGELOG.md +++ b/packages/camera/camera_web/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.3.5+2 + +* Fixes camera initialization failure on Firefox Android by using `{video: true}` instead + of `{video: {}}` when no video constraints are specified. + ## 0.3.5+1 * Uses `CanvasRenderingContext2D.drawImage` instead of the deprecated `drawImageScaled`. diff --git a/packages/camera/camera_web/example/integration_test/camera_options_test.dart b/packages/camera/camera_web/example/integration_test/camera_options_test.dart index 1c92bb74109..75d72107dd2 100644 --- a/packages/camera/camera_web/example/integration_test/camera_options_test.dart +++ b/packages/camera/camera_web/example/integration_test/camera_options_test.dart @@ -108,6 +108,13 @@ void main() { ); }); + testWidgets('serializes to true when no constraints are provided', ( + WidgetTester tester, + ) async { + const videoConstraints = VideoConstraints(); + expect(videoConstraints.toMediaStreamConstraints().dartify(), isTrue); + }); + testWidgets('supports value equality', (WidgetTester tester) async { expect( VideoConstraints( diff --git a/packages/camera/camera_web/lib/src/types/camera_options.dart b/packages/camera/camera_web/lib/src/types/camera_options.dart index a2c170fd372..fe3953fd5a2 100644 --- a/packages/camera/camera_web/lib/src/types/camera_options.dart +++ b/packages/camera/camera_web/lib/src/types/camera_options.dart @@ -108,12 +108,16 @@ class VideoConstraints { // TODO(dit): package:web has a class for this. Use it instead of jsify and toJson. /// Convert `this` to something that can be used on the browser. JSAny toMediaStreamConstraints() { - return { + final constraints = { if (width != null) 'width': width!.toJson(), if (height != null) 'height': height!.toJson(), if (facingMode != null) 'facingMode': facingMode!.toJson(), if (deviceId != null) 'deviceId': {'exact': deviceId!}, - }.jsify()!; + }; + + // Return true instead of empty object for better browser compatibility. + // Firefox Android rejects getUserMedia({video: {}}) but accepts {video: true}. + return constraints.isEmpty ? true.toJS : constraints.jsify()!; } @override diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index 0b8f161a6e0..2826d61702a 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_web description: A Flutter plugin for getting information about and controlling the camera on Web. repository: https://github.com/flutter/packages/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.3.5+1 +version: 0.3.5+2 environment: sdk: ^3.8.0