import android.os.Handler;
import com.android.camera.CameraDisabledException;
+import com.android.camera.cameradevice.CameraDeviceInfo;
import com.android.camera.cameradevice.CameraManager;
import com.android.camera.cameradevice.CameraManager.CameraExceptionCallback;
import com.android.camera.debug.Log;
private CameraManager.CameraOpenCallback mCallbackReceiver;
private final Handler mCallbackHandler;
private final CameraManager mCameraManager;
- private final Camera.CameraInfo[] mCameraInfos;
- private final int mNumberOfCameras;
- private final int mFirstBackCameraId;
- private final int mFirstFrontCameraId;
+ private CameraDeviceInfo mInfo;
private CameraManager.CameraProxy mCameraProxy;
private int mRequestingCameraId = EMPTY_REQUEST;
mCallbackReceiver = callbackReceiver;
mCallbackHandler = handler;
mCameraManager = cameraManager;
- mNumberOfCameras = Camera.getNumberOfCameras();
- mCameraInfos = new Camera.CameraInfo[mNumberOfCameras];
- for (int i = 0; i < mNumberOfCameras; i++) {
- mCameraInfos[i] = new Camera.CameraInfo();
- Camera.getCameraInfo(i, mCameraInfos[i]);
+ mInfo = mCameraManager.getCameraDeviceInfo();
+ if (mInfo == null && mCallbackReceiver != null) {
+ mCallbackReceiver.onDeviceOpenFailure(-1, "GETTING_CAMERA_INFO");
}
-
- int firstFront = -1;
- int firstBack = -1;
- // Get the first (smallest) back and first front camera id.
- for (int i = mNumberOfCameras - 1; i >= 0; i--) {
- if (mCameraInfos[i].facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
- firstBack = i;
- } else {
- if (mCameraInfos[i].facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
- firstFront = i;
- }
- }
- }
- mFirstBackCameraId = firstBack;
- mFirstFrontCameraId = firstFront;
}
@Override
@Override
public Camera.CameraInfo[] getCameraInfo() {
- return mCameraInfos;
+ if (mInfo == null) {
+ return null;
+ }
+ return mInfo.getCameraInfos();
}
@Override
public int getNumberOfCameras() {
- return mNumberOfCameras;
+ if (mInfo == null) {
+ return 0;
+ }
+ return mInfo.getNumberOfCameras();
}
@Override
public int getFirstBackCameraId() {
- return mFirstBackCameraId;
+ if (mInfo == null) {
+ return -1;
+ }
+ return mInfo.getFirstBackCameraId();
}
@Override
public int getFirstFrontCameraId() {
- return mFirstFrontCameraId;
+ if (mInfo == null) {
+ return -1;
+ }
+ return mInfo.getFirstFrontCameraId();
}
@Override
public boolean isFrontFacingCamera(int id) {
- if (id >= mCameraInfos.length || mCameraInfos[id] == null) {
+ if (mInfo == null) {
+ return false;
+ }
+ if (id >= mInfo.getCameraInfos().length || mInfo.getCameraInfos()[id] == null) {
Log.e(TAG, "Camera info not available:" + id);
return false;
}
- return (mCameraInfos[id].facing == Camera.CameraInfo.CAMERA_FACING_FRONT);
+ return (mInfo.getCameraInfos()[id].facing == Camera.CameraInfo.CAMERA_FACING_FRONT);
}
@Override
public boolean isBackFacingCamera(int id) {
- if (id >= mCameraInfos.length || mCameraInfos[id] == null) {
+ if (mInfo == null) {
+ return false;
+ }
+ if (id >= mInfo.getCameraInfos().length || mInfo.getCameraInfos()[id] == null) {
Log.e(TAG, "Camera info not available:" + id);
return false;
}
- return (mCameraInfos[id].facing == Camera.CameraInfo.CAMERA_FACING_BACK);
+ return (mInfo.getCameraInfos()[id].facing == Camera.CameraInfo.CAMERA_FACING_BACK);
}
@Override
if (mRequestingCameraId != EMPTY_REQUEST || mRequestingCameraId == id) {
return;
}
+ if (mInfo == null) {
+ return;
+ }
mRequestingCameraId = id;
if (mCameraProxy == null) {
// No camera yet.
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;
--- /dev/null
+package com.android.camera.cameradevice;
+
+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();
+}
}
/**
+ * 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
*/
public void openCamera(Handler handler, int cameraId, CameraOpenCallback callback);
-
/**
* Closes the camera device.
*
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.
*/
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();
}