OSDN Git Service

Handle error getting camera info.
authorAngus Kong <shkong@google.com>
Mon, 12 May 2014 22:31:35 +0000 (15:31 -0700)
committerAngus Kong <shkong@google.com>
Tue, 13 May 2014 21:14:54 +0000 (14:14 -0700)
bug:13877028
Change-Id: Iff0353738de3290244092076b2f955f0d7d57408

src/com/android/camera/app/CameraController.java
src/com/android/camera/cameradevice/AndroidCameraManagerImpl.java
src/com/android/camera/cameradevice/CameraDeviceInfo.java [new file with mode: 0644]
src/com/android/camera/cameradevice/CameraManager.java

index 78f7e80..f23cfaa 100644 (file)
@@ -21,6 +21,7 @@ import android.hardware.Camera;
 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;
@@ -38,10 +39,7 @@ public class CameraController implements CameraManager.CameraOpenCallback, Camer
     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;
@@ -61,27 +59,10 @@ public class CameraController implements CameraManager.CameraOpenCallback, Camer
         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
@@ -92,40 +73,58 @@ public class CameraController implements CameraManager.CameraOpenCallback, Camer
 
     @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
@@ -183,6 +182,9 @@ public class CameraController implements CameraManager.CameraOpenCallback, Camer
         if (mRequestingCameraId != EMPTY_REQUEST || mRequestingCameraId == id) {
             return;
         }
+        if (mInfo == null) {
+            return;
+        }
         mRequestingCameraId = id;
         if (mCameraProxy == null) {
             // No camera yet.
index b116bd2..35f3402 100644 (file)
@@ -141,6 +141,77 @@ class AndroidCameraManagerImpl implements CameraManager {
         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/src/com/android/camera/cameradevice/CameraDeviceInfo.java b/src/com/android/camera/cameradevice/CameraDeviceInfo.java
new file mode 100644 (file)
index 0000000..6cafb9f
--- /dev/null
@@ -0,0 +1,35 @@
+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();
+}
index a0a85ed..2d63d8e 100644 (file)
@@ -112,6 +112,16 @@ public interface CameraManager {
     }
 
     /**
+     * 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 interface CameraManager {
      */
     public void openCamera(Handler handler, int cameraId, CameraOpenCallback callback);
 
-
     /**
      * Closes the camera device.
      *
@@ -180,6 +189,24 @@ public interface CameraManager {
     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 interface CameraManager {
          */
         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();
 }