[camera] Add filter for unsupported cameras on Android (#4418)
diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java
index 003d80a..11b6eea 100644
--- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java
+++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java
@@ -97,6 +97,16 @@
String[] cameraNames = cameraManager.getCameraIdList();
List<Map<String, Object>> cameras = new ArrayList<>();
for (String cameraName : cameraNames) {
+ int cameraId;
+ try {
+ cameraId = Integer.parseInt(cameraName, 10);
+ } catch (NumberFormatException e) {
+ cameraId = -1;
+ }
+ if (cameraId < 0) {
+ continue;
+ }
+
HashMap<String, Object> details = new HashMap<>();
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraName);
details.put("name", cameraName);
diff --git a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraUtilsTest.java b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraUtilsTest.java
index 6b714ce..e59b05b 100644
--- a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraUtilsTest.java
+++ b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraUtilsTest.java
@@ -5,8 +5,20 @@
package io.flutter.plugins.camera;
import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import android.app.Activity;
+import android.content.Context;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CameraMetadata;
import io.flutter.embedding.engine.systemchannels.PlatformChannel;
+import java.util.List;
+import java.util.Map;
import org.junit.Test;
public class CameraUtilsTest {
@@ -52,4 +64,37 @@
public void deserializeDeviceOrientation_throwsForNull() {
CameraUtils.deserializeDeviceOrientation(null);
}
+
+ @Test
+ public void getAvailableCameras_retrievesValidCameras()
+ throws CameraAccessException, NumberFormatException {
+ final Activity mockActivity = mock(Activity.class);
+ final CameraManager mockCameraManager = mock(CameraManager.class);
+ final CameraCharacteristics mockCameraCharacteristics = mock(CameraCharacteristics.class);
+ final String[] mockCameraIds = {"1394902", "-192930", "0283835", "foobar"};
+ final int mockSensorOrientation0 = 90;
+ final int mockSensorOrientation2 = 270;
+ final int mockLensFacing0 = CameraMetadata.LENS_FACING_FRONT;
+ final int mockLensFacing2 = CameraMetadata.LENS_FACING_EXTERNAL;
+
+ when(mockActivity.getSystemService(Context.CAMERA_SERVICE)).thenReturn(mockCameraManager);
+ when(mockCameraManager.getCameraIdList()).thenReturn(mockCameraIds);
+ when(mockCameraManager.getCameraCharacteristics(anyString()))
+ .thenReturn(mockCameraCharacteristics);
+ when(mockCameraCharacteristics.get(any()))
+ .thenReturn(mockSensorOrientation0)
+ .thenReturn(mockLensFacing0)
+ .thenReturn(mockSensorOrientation2)
+ .thenReturn(mockLensFacing2);
+
+ List<Map<String, Object>> availableCameras = CameraUtils.getAvailableCameras(mockActivity);
+
+ assertEquals(availableCameras.size(), 2);
+ assertEquals(availableCameras.get(0).get("name"), "1394902");
+ assertEquals(availableCameras.get(0).get("sensorOrientation"), mockSensorOrientation0);
+ assertEquals(availableCameras.get(0).get("lensFacing"), "front");
+ assertEquals(availableCameras.get(1).get("name"), "0283835");
+ assertEquals(availableCameras.get(1).get("sensorOrientation"), mockSensorOrientation2);
+ assertEquals(availableCameras.get(1).get("lensFacing"), "external");
+ }
}