diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index 9cc0b14dafbd..17b84d3c633f 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 2.2.1 +* Handles Android camera permissions error code that indicates a request being made while another was in progress. * Ignores unnecessary import warnings in preparation for [upcoming Flutter changes](https://github.com/flutter/flutter/pull/104231). * Ignores missing return warnings in preparation for [upcoming analysis changes](https://github.com/flutter/flutter/issues/105750). diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart index fd9ad530bd27..f234ad980045 100644 --- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart +++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart @@ -28,6 +28,10 @@ class MethodChannelCamera extends CameraPlatform { final Map _channels = {}; + /// Error code used to detect multiple requests for camera permissions on Android. + static const String cameraPermissionsRequestOngoingErrorCode = + 'CameraPermissionsRequestOngoing'; + /// The controller we need to broadcast the different events coming /// from handleMethodCall, specific to camera events. /// @@ -101,6 +105,10 @@ class MethodChannelCamera extends CameraPlatform { return reply!['cameraId']! as int; } on PlatformException catch (e) { + if (e.code == cameraPermissionsRequestOngoingErrorCode) { + throw StateError(e.message!); + } + throw CameraException(e.code, e.message); } } diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index 473dcb552c82..fb33b088e40f 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.2.0 +version: 2.2.1 environment: sdk: '>=2.12.0 <3.0.0' diff --git a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart index d096f0012c86..607103b0cdf8 100644 --- a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart +++ b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart @@ -56,14 +56,14 @@ void main() { }); test( - 'Should throw CameraException when create throws a PlatformException', + 'Should throw StateError when create is called while camera permissions request ongoing', () { // Arrange MethodChannelMock( channelName: 'plugins.flutter.io/camera', methods: { 'create': PlatformException( - code: 'TESTING_ERROR_CODE', + code: 'CameraPermissionsRequestOngoing', message: 'Mock error message used during testing.', ) }); @@ -71,22 +71,16 @@ void main() { // Act expect( - () => camera.createCamera( - const CameraDescription( - name: 'Test', - lensDirection: CameraLensDirection.back, - sensorOrientation: 0, - ), - ResolutionPreset.high, - ), - throwsA( - isA() - .having( - (CameraException e) => e.code, 'code', 'TESTING_ERROR_CODE') - .having((CameraException e) => e.description, 'description', - 'Mock error message used during testing.'), - ), - ); + () => camera.createCamera( + const CameraDescription( + name: 'Test', + lensDirection: CameraLensDirection.back, + sensorOrientation: 0, + ), + ResolutionPreset.high, + ), + throwsStateError, + reason: 'Mock error message used during testing.'); }); test(