From e3d7bcb57079be39501be5908bc1505d146af9ad Mon Sep 17 00:00:00 2001 From: Danang Rahmatullah Date: Sun, 26 Oct 2025 06:04:54 +0100 Subject: [PATCH 1/4] use camera ID retrieved from Camera2CameraInfo as camera name --- .../lib/src/android_camera_camerax.dart | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart index 136f62084e06..f18c34b17486 100644 --- a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart +++ b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart @@ -303,7 +303,6 @@ class AndroidCameraCameraX extends CameraPlatform { (await processCameraProvider!.getAvailableCameraInfos()).cast(); CameraLensDirection? cameraLensDirection; - var cameraCount = 0; int? cameraSensorOrientation; String? cameraName; @@ -324,13 +323,11 @@ class AndroidCameraCameraX extends CameraPlatform { } cameraSensorOrientation = cameraInfo.sensorRotationDegrees; - cameraName = 'Camera $cameraCount'; - cameraCount++; + cameraName = + await Camera2CameraInfo.from(cameraInfo: cameraInfo).getCameraId(); _savedCameras[cameraName] = cameraInfo; - // TODO(camsim99): Use camera ID retrieved from Camera2CameraInfo as - // camera name: https://github.com/flutter/flutter/issues/147545. cameraDescriptions.add( CameraDescription( name: cameraName, From 23d6d7bbf7a62687b516a6ed9aad64644cec2f19 Mon Sep 17 00:00:00 2001 From: Danang Rahmatullah Date: Mon, 12 Jan 2026 14:02:56 +0100 Subject: [PATCH 2/4] fix Camera2CameraInfo getCameraId tests --- .../test/android_camera_camerax_test.dart | 60 ++++++++++++++++--- 1 file changed, 51 insertions(+), 9 deletions(-) diff --git a/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart b/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart index 16ffabfd0e89..14ef1773067c 100644 --- a/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart +++ b/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart @@ -503,12 +503,12 @@ void main() { final camera = AndroidCameraCameraX(); final returnData = [ { - 'name': 'Camera 0', + 'name': '0', 'lensFacing': 'back', 'sensorOrientation': 0, }, { - 'name': 'Camera 1', + 'name': '1', 'lensFacing': 'front', 'sensorOrientation': 90, }, @@ -537,6 +537,19 @@ void main() { return mockBackCameraSelector; }; + PigeonOverrides.camera2CameraInfo_from = ({required dynamic cameraInfo}) { + final camera2cameraInfo = MockCamera2CameraInfo(); + var cameraId = ''; + if (cameraInfo == mockBackCameraInfo) { + cameraId = '0'; + } else if (cameraInfo == mockFrontCameraInfo) { + cameraId = '1'; + } + when( + camera2cameraInfo.getCameraId(), + ).thenAnswer((_) async => cameraId); + return camera2cameraInfo; + }; PigeonOverrides.systemServicesManager_new = ({ required void Function(SystemServicesManager, String) onCameraError, @@ -1696,17 +1709,17 @@ void main() { final camera = AndroidCameraCameraX(); final returnData = [ { - 'name': 'Camera 0', + 'name': '0', 'lensFacing': 'back', 'sensorOrientation': 0, }, { - 'name': 'Camera 1', + 'name': '1', 'lensFacing': 'back', 'sensorOrientation': 0, }, { - 'name': 'Camera 2', + 'name': '2', 'lensFacing': 'front', 'sensorOrientation': 0, }, @@ -1872,6 +1885,17 @@ void main() { return MockResolutionFilter(); }; PigeonOverrides.camera2CameraInfo_from = ({required dynamic cameraInfo}) { + var cameraId = ''; + if (cameraInfo == mockBackCameraInfoOne) { + cameraId = '0'; + } else if (cameraInfo == mockBackCameraInfoTwo) { + cameraId = '1'; + } else if (cameraInfo == mockFrontCameraInfo) { + cameraId = '2'; + } + when( + mockCamera2CameraInfo.getCameraId(), + ).thenAnswer((_) async => cameraId); when( mockCamera2CameraInfo.getCameraCharacteristic( mockCameraCharacteristicsKey, @@ -3323,12 +3347,12 @@ void main() { const testSensorOrientation = 90; const testBackCameraDescription = CameraDescription( - name: 'Camera 0', + name: '0', lensDirection: CameraLensDirection.back, sensorOrientation: testSensorOrientation, ); const testFrontCameraDescription = CameraDescription( - name: 'Camera 1', + name: '1', lensDirection: CameraLensDirection.front, sensorOrientation: testSensorOrientation, ); @@ -3430,6 +3454,15 @@ void main() { }; PigeonOverrides.camera2CameraInfo_from = ({required dynamic cameraInfo}) { final camera2cameraInfo = MockCamera2CameraInfo(); + var cameraId = ''; + if (cameraInfo == mockBackCameraInfo) { + cameraId = '0'; + } else if (cameraInfo == mockFrontCameraInfo) { + cameraId = '1'; + } + when( + camera2cameraInfo.getCameraId(), + ).thenAnswer((_) async => cameraId); when( camera2cameraInfo.getCameraCharacteristic(any), ).thenAnswer((_) async => InfoSupportedHardwareLevel.limited); @@ -3594,12 +3627,12 @@ void main() { const testSensorOrientation = 90; const testBackCameraDescription = CameraDescription( - name: 'Camera 0', + name: '0', lensDirection: CameraLensDirection.back, sensorOrientation: testSensorOrientation, ); const testFrontCameraDescription = CameraDescription( - name: 'Camera 1', + name: '1', lensDirection: CameraLensDirection.front, sensorOrientation: testSensorOrientation, ); @@ -3698,6 +3731,15 @@ void main() { }; PigeonOverrides.camera2CameraInfo_from = ({required dynamic cameraInfo}) { final camera2cameraInfo = MockCamera2CameraInfo(); + var cameraId = ''; + if (cameraInfo == mockBackCameraInfo) { + cameraId = '0'; + } else if (cameraInfo == mockFrontCameraInfo) { + cameraId = '1'; + } + when( + camera2cameraInfo.getCameraId(), + ).thenAnswer((_) async => cameraId); when( camera2cameraInfo.getCameraCharacteristic(any), ).thenAnswer((_) async => InfoSupportedHardwareLevel.limited); From 2d09af848c698a52dd042d52c30018e9bd0bce7f Mon Sep 17 00:00:00 2001 From: Danang Rahmatullah Date: Mon, 12 Jan 2026 14:26:03 +0100 Subject: [PATCH 3/4] bump camera_android_camerax version and update changelog --- packages/camera/camera_android_camerax/CHANGELOG.md | 4 ++++ packages/camera/camera_android_camerax/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index d4712a196760..17e120259871 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.27 + +* Changes `availableCameras` to get the camera name from `Camera2CameraInfo.getCameraId`. + ## 0.6.26+3 * Bumps kotlin_version to 2.3.0. diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index 830322fdc33a..6ab1c8390c95 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_android_camerax description: Android implementation of the camera plugin using the CameraX library. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_android_camerax issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.6.26+3 +version: 0.6.27 environment: sdk: ^3.9.0 From 0b855d8087a12318b0bada07dfd15eb7ebacbf7c Mon Sep 17 00:00:00 2001 From: Danang Rahmatullah Date: Mon, 12 Jan 2026 16:53:00 +0100 Subject: [PATCH 4/4] format files --- .../lib/src/android_camera_camerax.dart | 5 +++-- .../test/android_camera_camerax_test.dart | 12 +++--------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart index f18c34b17486..43c96f272692 100644 --- a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart +++ b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax.dart @@ -323,8 +323,9 @@ class AndroidCameraCameraX extends CameraPlatform { } cameraSensorOrientation = cameraInfo.sensorRotationDegrees; - cameraName = - await Camera2CameraInfo.from(cameraInfo: cameraInfo).getCameraId(); + cameraName = await Camera2CameraInfo.from( + cameraInfo: cameraInfo, + ).getCameraId(); _savedCameras[cameraName] = cameraInfo; diff --git a/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart b/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart index 14ef1773067c..9e09c568ff97 100644 --- a/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart +++ b/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart @@ -545,9 +545,7 @@ void main() { } else if (cameraInfo == mockFrontCameraInfo) { cameraId = '1'; } - when( - camera2cameraInfo.getCameraId(), - ).thenAnswer((_) async => cameraId); + when(camera2cameraInfo.getCameraId()).thenAnswer((_) async => cameraId); return camera2cameraInfo; }; PigeonOverrides.systemServicesManager_new = @@ -3460,9 +3458,7 @@ void main() { } else if (cameraInfo == mockFrontCameraInfo) { cameraId = '1'; } - when( - camera2cameraInfo.getCameraId(), - ).thenAnswer((_) async => cameraId); + when(camera2cameraInfo.getCameraId()).thenAnswer((_) async => cameraId); when( camera2cameraInfo.getCameraCharacteristic(any), ).thenAnswer((_) async => InfoSupportedHardwareLevel.limited); @@ -3737,9 +3733,7 @@ void main() { } else if (cameraInfo == mockFrontCameraInfo) { cameraId = '1'; } - when( - camera2cameraInfo.getCameraId(), - ).thenAnswer((_) async => cameraId); + when(camera2cameraInfo.getCameraId()).thenAnswer((_) async => cameraId); when( camera2cameraInfo.getCameraCharacteristic(any), ).thenAnswer((_) async => InfoSupportedHardwareLevel.limited);