diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index e3899c340571..6fbbc744771d 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.9.9 +* Fixes getAvailableCameras to return all possible cameras. * Ignores missing return warnings in preparation for [upcoming analysis changes](https://github.com/flutter/flutter/issues/105750). ## 0.9.8+3 diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java index 11b6eeaa5b50..d75e26440446 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java @@ -12,6 +12,7 @@ import android.hardware.camera2.CameraMetadata; import io.flutter.embedding.engine.systemchannels.PlatformChannel; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -94,8 +95,27 @@ static PlatformChannel.DeviceOrientation deserializeDeviceOrientation(String ori public static List> getAvailableCameras(Activity activity) throws CameraAccessException { CameraManager cameraManager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); - String[] cameraNames = cameraManager.getCameraIdList(); + + List cameraNames = new ArrayList<>(Arrays.asList(cameraManager.getCameraIdList())); List> cameras = new ArrayList<>(); + + boolean expectingCamera = true; + int i = 0; + + while (expectingCamera) { + try { + String cameraName = String.valueOf(i); + cameraNames.remove(cameraName); + CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraName); + Map details = serializeCameraCharacteristics(cameraName, characteristics); + cameras.add(details); + i++; + } catch (Exception e) { + // retrieving Camera failed, most probably there is no other physical non-removable camera. + expectingCamera = false; + } + } + for (String cameraName : cameraNames) { int cameraId; try { @@ -107,26 +127,31 @@ public static List> getAvailableCameras(Activity activity) continue; } - HashMap details = new HashMap<>(); CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraName); - details.put("name", cameraName); - int sensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); - details.put("sensorOrientation", sensorOrientation); - - int lensFacing = characteristics.get(CameraCharacteristics.LENS_FACING); - switch (lensFacing) { - case CameraMetadata.LENS_FACING_FRONT: - details.put("lensFacing", "front"); - break; - case CameraMetadata.LENS_FACING_BACK: - details.put("lensFacing", "back"); - break; - case CameraMetadata.LENS_FACING_EXTERNAL: - details.put("lensFacing", "external"); - break; - } + Map details = serializeCameraCharacteristics(cameraName, characteristics); cameras.add(details); } return cameras; } + + private static Map serializeCameraCharacteristics( + String name, CameraCharacteristics cameraCharacteristics) { + HashMap details = new HashMap<>(); + details.put("name", name); + int sensorOrientation = cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); + details.put("sensorOrientation", sensorOrientation); + int lensFacing = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING); + switch (lensFacing) { + case CameraMetadata.LENS_FACING_FRONT: + details.put("lensFacing", "front"); + break; + case CameraMetadata.LENS_FACING_BACK: + details.put("lensFacing", "back"); + break; + case CameraMetadata.LENS_FACING_EXTERNAL: + details.put("lensFacing", "external"); + break; + } + return details; + } } diff --git a/packages/camera/camera_android/example/android/app/build.gradle b/packages/camera/camera_android/example/android/app/build.gradle index 476d65373723..e0d69afc195e 100644 --- a/packages/camera/camera_android/example/android/app/build.gradle +++ b/packages/camera/camera_android/example/android/app/build.gradle @@ -34,7 +34,7 @@ android { defaultConfig { applicationId "io.flutter.plugins.cameraexample" minSdkVersion 21 - targetSdkVersion 28 + targetSdkVersion 31 versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/packages/camera/camera_android/example/android/app/src/main/AndroidManifest.xml b/packages/camera/camera_android/example/android/app/src/main/AndroidManifest.xml index cef23162ddb6..4484712506bf 100644 --- a/packages/camera/camera_android/example/android/app/src/main/AndroidManifest.xml +++ b/packages/camera/camera_android/example/android/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ android:icon="@mipmap/ic_launcher" android:label="camera_example"> ), _captureControlRowWidget(), _modeControlRowWidget(), - Padding( + Container( + width: double.infinity, padding: const EdgeInsets.all(5.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, + height: 50, + child: ListView( + shrinkWrap: true, + scrollDirection: Axis.horizontal, children: [ - _cameraTogglesRowWidget(), + ..._cameraTogglesRowWidget(), _thumbnailWidget(), ], ), @@ -586,7 +589,7 @@ class _CameraExampleHomeState extends State } /// Display a row of toggle to select the camera (or a message if no camera is available). - Widget _cameraTogglesRowWidget() { + List _cameraTogglesRowWidget() { final List toggles = []; void onChanged(CameraDescription? description) { @@ -601,7 +604,7 @@ class _CameraExampleHomeState extends State _ambiguate(SchedulerBinding.instance)?.addPostFrameCallback((_) async { showInSnackBar('No camera found.'); }); - return const Text('None'); + return [const Text('None')]; } else { for (final CameraDescription cameraDescription in _cameras) { toggles.add( @@ -621,7 +624,7 @@ class _CameraExampleHomeState extends State } } - return Row(children: toggles); + return toggles; } String timestamp() => DateTime.now().millisecondsSinceEpoch.toString(); diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index a1b7a930e228..2df7982e5fd9 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_android description: Android implementation of the camera plugin. repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.9.8+3 +version: 0.9.9 environment: sdk: ">=2.14.0 <3.0.0"