Handle error getting camera info.
bug:13877028
Change-Id: Iff0353738de3290244092076b2f955f0d7d57408
diff --git a/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraManagerImpl.java b/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraManagerImpl.java
index bcf2c7c..b026a83 100644
--- a/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraManagerImpl.java
+++ b/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraManagerImpl.java
@@ -141,6 +141,77 @@
mDispatchThread.end();
}
+ @Override
+ public CameraDeviceInfo getCameraDeviceInfo() {
+ return AndroidCameraDeviceInfo.create();
+ }
+
+ private static class AndroidCameraDeviceInfo implements CameraDeviceInfo {
+ private final Camera.CameraInfo[] mCameraInfos;
+ private final int mNumberOfCameras;
+ private final int mFirstBackCameraId;
+ private final int mFirstFrontCameraId;
+
+ private AndroidCameraDeviceInfo(Camera.CameraInfo[] info, int numberOfCameras,
+ int firstBackCameraId, int firstFrontCameraId) {
+
+ mCameraInfos = info;
+ mNumberOfCameras = numberOfCameras;
+ mFirstBackCameraId = firstBackCameraId;
+ mFirstFrontCameraId = firstFrontCameraId;
+ }
+
+ public static AndroidCameraDeviceInfo create() {
+ int numberOfCameras;
+ Camera.CameraInfo[] cameraInfos;
+ try {
+ numberOfCameras = Camera.getNumberOfCameras();
+ cameraInfos = new Camera.CameraInfo[numberOfCameras];
+ for (int i = 0; i < numberOfCameras; i++) {
+ cameraInfos[i] = new Camera.CameraInfo();
+ Camera.getCameraInfo(i, cameraInfos[i]);
+ }
+ } catch (RuntimeException ex) {
+ return null;
+ }
+
+ int firstFront = NO_DEVICE;
+ int firstBack = NO_DEVICE;
+ // Get the first (smallest) back and first front camera id.
+ for (int i = numberOfCameras - 1; i >= 0; i--) {
+ if (cameraInfos[i].facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
+ firstBack = i;
+ } else {
+ if (cameraInfos[i].facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
+ firstFront = i;
+ }
+ }
+ }
+
+ return new AndroidCameraDeviceInfo(cameraInfos, numberOfCameras, firstBack, firstFront);
+ }
+
+ @Override
+ public Camera.CameraInfo[] getCameraInfos() {
+ return mCameraInfos;
+ }
+
+ @Override
+ public int getNumberOfCameras() {
+ return mNumberOfCameras;
+ }
+
+ @Override
+ public int getFirstBackCameraId() {
+ return mFirstBackCameraId;
+ }
+
+ @Override
+ public int getFirstFrontCameraId() {
+ return mFirstFrontCameraId;
+ }
+ }
+
private static class CameraStateHolder {
private int mState;
diff --git a/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java b/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java
new file mode 100644
index 0000000..60ad8ed
--- /dev/null
+++ b/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java
@@ -0,0 +1,35 @@
+package com.android.ex.camera2.portability;
+
+import android.hardware.Camera;
+
+/**
+ * The camera device info.
+ */
+public interface CameraDeviceInfo {
+
+ static final int NO_DEVICE = -1;
+
+ /**
+ * @return The camera info.
+ * // TODO: Remove the dependency on API 1.
+ */
+ @Deprecated
+ Camera.CameraInfo[] getCameraInfos();
+
+ /**
+ * @return The total number of the available camera devices.
+ */
+ int getNumberOfCameras();
+
+ /**
+ * @return The first (lowest) ID of the back cameras or {@code NO_DEVICE}
+ * if not available.
+ */
+ int getFirstBackCameraId();
+
+ /**
+ * @return The first (lowest) ID of the front cameras or {@code NO_DEVICE}
+ * if not available.
+ */
+ int getFirstFrontCameraId();
+}
diff --git a/camera2/portability/src/com/android/ex/camera2/portability/CameraManager.java b/camera2/portability/src/com/android/ex/camera2/portability/CameraManager.java
index b5707b6..06b3ee7 100644
--- a/camera2/portability/src/com/android/ex/camera2/portability/CameraManager.java
+++ b/camera2/portability/src/com/android/ex/camera2/portability/CameraManager.java
@@ -112,6 +112,16 @@
}
/**
+ * An interface to be called when the camera preview has started.
+ */
+ public interface CameraStartPreviewCallback {
+ /**
+ * Callback when the preview starts.
+ */
+ public void onPreviewStarted();
+ }
+
+ /**
* An interface to be called for any events when opening or closing the
* camera device. This error callback is different from the one defined
* in the framework, {@link android.hardware.Camera.ErrorCallback}, which
@@ -170,7 +180,6 @@
*/
public void openCamera(Handler handler, int cameraId, CameraOpenCallback callback);
-
/**
* Closes the camera device.
*
@@ -180,6 +189,24 @@
public void closeCamera(CameraProxy camera, boolean synced);
/**
+ * Sets a callback for handling camera api runtime exceptions on
+ * a handler.
+ */
+ public void setCameraDefaultExceptionCallback(CameraExceptionCallback callback,
+ Handler handler);
+
+ /**
+ * Recycles the resources used by this instance. CameraManager will be in
+ * an unusable state after calling this.
+ */
+ public void recycle();
+
+ /**
+ * @return The camera devices info.
+ */
+ public CameraDeviceInfo getCameraDeviceInfo();
+
+ /**
* An interface that takes camera operation requests and post messages to the
* camera handler thread. All camera operations made through this interface is
* asynchronous by default except those mentioned specifically.
@@ -419,27 +446,4 @@
*/
public void enableShutterSound(boolean enable);
}
-
- /**
- * An interface to be called when the camera preview has started.
- */
- public interface CameraStartPreviewCallback {
- /**
- * Callback when the preview starts.
- */
- public void onPreviewStarted();
- }
-
- /**
- * Sets a callback for handling camera api runtime exceptions on
- * a handler.
- */
- public void setCameraDefaultExceptionCallback(CameraExceptionCallback callback,
- Handler handler);
-
- /**
- * Recycles the resources used by this instance. CameraManager will be in
- * an unusable state after calling this.
- */
- public void recycle();
}