Skip to content

Commit 18f273c

Browse files
camsim99KyleFin
authored andcommitted
[camera] Add filter for unsupported cameras on Android (flutter#4418)
1 parent 6d12279 commit 18f273c

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/CameraUtils.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,16 @@ public static List<Map<String, Object>> getAvailableCameras(Activity activity)
9797
String[] cameraNames = cameraManager.getCameraIdList();
9898
List<Map<String, Object>> cameras = new ArrayList<>();
9999
for (String cameraName : cameraNames) {
100+
int cameraId;
101+
try {
102+
cameraId = Integer.parseInt(cameraName, 10);
103+
} catch (NumberFormatException e) {
104+
cameraId = -1;
105+
}
106+
if (cameraId < 0) {
107+
continue;
108+
}
109+
100110
HashMap<String, Object> details = new HashMap<>();
101111
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraName);
102112
details.put("name", cameraName);

packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/CameraUtilsTest.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,20 @@
55
package io.flutter.plugins.camera;
66

77
import static org.junit.Assert.assertEquals;
8+
import static org.mockito.Mockito.any;
9+
import static org.mockito.Mockito.anyString;
10+
import static org.mockito.Mockito.mock;
11+
import static org.mockito.Mockito.when;
812

13+
import android.app.Activity;
14+
import android.content.Context;
15+
import android.hardware.camera2.CameraAccessException;
16+
import android.hardware.camera2.CameraCharacteristics;
17+
import android.hardware.camera2.CameraManager;
18+
import android.hardware.camera2.CameraMetadata;
919
import io.flutter.embedding.engine.systemchannels.PlatformChannel;
20+
import java.util.List;
21+
import java.util.Map;
1022
import org.junit.Test;
1123

1224
public class CameraUtilsTest {
@@ -52,4 +64,37 @@ public void deserializeDeviceOrientation_deserializesCorrectly() {
5264
public void deserializeDeviceOrientation_throwsForNull() {
5365
CameraUtils.deserializeDeviceOrientation(null);
5466
}
67+
68+
@Test
69+
public void getAvailableCameras_retrievesValidCameras()
70+
throws CameraAccessException, NumberFormatException {
71+
final Activity mockActivity = mock(Activity.class);
72+
final CameraManager mockCameraManager = mock(CameraManager.class);
73+
final CameraCharacteristics mockCameraCharacteristics = mock(CameraCharacteristics.class);
74+
final String[] mockCameraIds = {"1394902", "-192930", "0283835", "foobar"};
75+
final int mockSensorOrientation0 = 90;
76+
final int mockSensorOrientation2 = 270;
77+
final int mockLensFacing0 = CameraMetadata.LENS_FACING_FRONT;
78+
final int mockLensFacing2 = CameraMetadata.LENS_FACING_EXTERNAL;
79+
80+
when(mockActivity.getSystemService(Context.CAMERA_SERVICE)).thenReturn(mockCameraManager);
81+
when(mockCameraManager.getCameraIdList()).thenReturn(mockCameraIds);
82+
when(mockCameraManager.getCameraCharacteristics(anyString()))
83+
.thenReturn(mockCameraCharacteristics);
84+
when(mockCameraCharacteristics.get(any()))
85+
.thenReturn(mockSensorOrientation0)
86+
.thenReturn(mockLensFacing0)
87+
.thenReturn(mockSensorOrientation2)
88+
.thenReturn(mockLensFacing2);
89+
90+
List<Map<String, Object>> availableCameras = CameraUtils.getAvailableCameras(mockActivity);
91+
92+
assertEquals(availableCameras.size(), 2);
93+
assertEquals(availableCameras.get(0).get("name"), "1394902");
94+
assertEquals(availableCameras.get(0).get("sensorOrientation"), mockSensorOrientation0);
95+
assertEquals(availableCameras.get(0).get("lensFacing"), "front");
96+
assertEquals(availableCameras.get(1).get("name"), "0283835");
97+
assertEquals(availableCameras.get(1).get("sensorOrientation"), mockSensorOrientation2);
98+
assertEquals(availableCameras.get(1).get("lensFacing"), "external");
99+
}
55100
}

0 commit comments

Comments
 (0)