diff --git a/packages/camera/camera_web/CHANGELOG.md b/packages/camera/camera_web/CHANGELOG.md index 6fb3e44569c..a3848f12add 100644 --- a/packages/camera/camera_web/CHANGELOG.md +++ b/packages/camera/camera_web/CHANGELOG.md @@ -2,6 +2,7 @@ * Uses `CanvasRenderingContext2D.drawImage` instead of the deprecated `drawImageScaled`. * Updates minimum supported SDK version to Flutter 3.32/Dart 3.8. +* Fixes camera initialization failure on Firefox Android by using `{video: true}` instead of `{video: {}}` when no video constraints are specified. ## 0.3.5 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..4820e9d87a6 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 = 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..1fd653b0f8f 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 Map 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