diff options
author | Igor Murashkin <iam@google.com> | 2014-06-20 21:21:38 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-06-20 18:26:34 +0000 |
commit | 60679f6b7d45c45be5bd0a44026711890f6ff291 (patch) | |
tree | a798db34ee5e771a339ec07f9de84fc246335351 /core/java/android/hardware | |
parent | b127713b58c1a8f8bae687742ef15e60b3dbeb44 (diff) | |
parent | a1d662716b3da384dfe3a758f079e0cbd089784a (diff) | |
download | frameworks_base-60679f6b7d45c45be5bd0a44026711890f6ff291.zip frameworks_base-60679f6b7d45c45be5bd0a44026711890f6ff291.tar.gz frameworks_base-60679f6b7d45c45be5bd0a44026711890f6ff291.tar.bz2 |
Merge "camera: Get detailed error reporting from api1 Camera if open fails"
Diffstat (limited to 'core/java/android/hardware')
-rw-r--r-- | core/java/android/hardware/Camera.java | 84 | ||||
-rw-r--r-- | core/java/android/hardware/camera2/CameraManager.java | 15 | ||||
-rw-r--r-- | core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java | 10 |
3 files changed, 56 insertions, 53 deletions
diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index 44fc3b6..cc8503b 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -167,7 +167,7 @@ public class Camera { private boolean mOneShot; private boolean mWithBuffer; private boolean mFaceDetectionRunning = false; - private Object mAutoFocusCallbackLock = new Object(); + private final Object mAutoFocusCallbackLock = new Object(); private static final int NO_ERROR = 0; private static final int EACCESS = -13; @@ -202,14 +202,14 @@ public class Camera { /** * A constant meaning the normal camera connect/open will be used. - * @hide */ - public static final int CAMERA_HAL_API_VERSION_NORMAL_OPEN = -2; + private static final int CAMERA_HAL_API_VERSION_NORMAL_CONNECT = -2; /** * Used to indicate HAL version un-specified. */ private static final int CAMERA_HAL_API_VERSION_UNSPECIFIED = -1; + /** * Hardware face detection. It does not use much CPU. */ @@ -376,18 +376,25 @@ public class Camera { * * @param cameraId The hardware camera to access, between 0 and * {@link #getNumberOfCameras()}-1. - * @param halVersion The HAL API version this camera device to be opened as. When - * it is {@value #CAMERA_HAL_API_VERSION_NORMAL_OPEN}, the methods will be equivalent - * to {@link #open}, but more detailed error information will be returned to managed code. + * @param halVersion The HAL API version this camera device to be opened as. * @return a new Camera object, connected, locked and ready for use. + * + * @throws IllegalArgumentException if the {@code halVersion} is invalid + * * @throws RuntimeException if opening the camera fails (for example, if the * camera is in use by another process or device policy manager has disabled * the camera). + * * @see android.app.admin.DevicePolicyManager#getCameraDisabled(android.content.ComponentName) + * @see #CAMERA_HAL_API_VERSION_1_0 * * @hide */ public static Camera openLegacy(int cameraId, int halVersion) { + if (halVersion < CAMERA_HAL_API_VERSION_1_0) { + throw new IllegalArgumentException("Invalid HAL version " + halVersion); + } + return new Camera(cameraId, halVersion); } @@ -399,7 +406,7 @@ public class Camera { * @param halVersion The HAL API version this camera device to be opened as. */ private Camera(int cameraId, int halVersion) { - int err = cameraInit(cameraId, halVersion); + int err = cameraInitVersion(cameraId, halVersion); if (checkInitErrors(err)) { switch(err) { case EACCESS: @@ -428,13 +435,7 @@ public class Camera { } } - private int cameraInit(int cameraId, int halVersion) { - // This function should be only called by Camera(int cameraId, int halVersion). - if (halVersion < CAMERA_HAL_API_VERSION_1_0 && - halVersion != CAMERA_HAL_API_VERSION_NORMAL_OPEN) { - throw new IllegalArgumentException("Invalid HAL version " + halVersion); - } - + private int cameraInitVersion(int cameraId, int halVersion) { mShutterCallback = null; mRawImageCallback = null; mJpegCallback = null; @@ -457,8 +458,31 @@ public class Camera { return native_setup(new WeakReference<Camera>(this), cameraId, halVersion, packageName); } + private int cameraInitNormal(int cameraId) { + return cameraInitVersion(cameraId, CAMERA_HAL_API_VERSION_NORMAL_CONNECT); + } + + /** + * Connect to the camera service using #connectLegacy + * + * <p> + * This acts the same as normal except that it will return + * the detailed error code if open fails instead of + * converting everything into {@code NO_INIT}.</p> + * + * <p>Intended to use by the camera2 shim only, do <i>not</i> use this for other code.</p> + * + * @return a detailed errno error code, or {@code NO_ERROR} on success + * + * @hide + */ + public int cameraInitUnspecified(int cameraId) { + return cameraInitVersion(cameraId, CAMERA_HAL_API_VERSION_UNSPECIFIED); + } + + /** used by Camera#open, Camera#open(int) */ Camera(int cameraId) { - int err = cameraInit(cameraId); + int err = cameraInitNormal(cameraId); if (checkInitErrors(err)) { switch(err) { case EACCESS: @@ -472,32 +496,6 @@ public class Camera { } } - /** - * @hide - */ - public int cameraInit(int cameraId) { - mShutterCallback = null; - mRawImageCallback = null; - mJpegCallback = null; - mPreviewCallback = null; - mPostviewCallback = null; - mUsingPreviewAllocation = false; - mZoomListener = null; - - Looper looper; - if ((looper = Looper.myLooper()) != null) { - mEventHandler = new EventHandler(this, looper); - } else if ((looper = Looper.getMainLooper()) != null) { - mEventHandler = new EventHandler(this, looper); - } else { - mEventHandler = null; - } - - String packageName = ActivityThread.currentPackageName(); - - return native_setup(new WeakReference<Camera>(this), cameraId, - CAMERA_HAL_API_VERSION_UNSPECIFIED, packageName); - } /** * @hide @@ -519,6 +517,7 @@ public class Camera { Camera() { } + @Override protected void finalize() { release(); } @@ -1056,7 +1055,7 @@ public class Camera { private class EventHandler extends Handler { - private Camera mCamera; + private final Camera mCamera; public EventHandler(Camera c, Looper looper) { super(looper); @@ -2337,6 +2336,7 @@ public class Camera { * @hide * @deprecated */ + @Deprecated public void dump() { Log.e(TAG, "dump: size=" + mMap.size()); for (String k : mMap.keySet()) { diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index 73188ff..9a3d806 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -278,14 +278,19 @@ public final class CameraManager { ICameraDeviceCallbacks callbacks = deviceImpl.getCallbacks(); int id = Integer.parseInt(cameraId); try { - mCameraService.connectDevice(callbacks, id, mContext.getPackageName(), - USE_CALLING_UID, holder); - cameraUser = ICameraDeviceUser.Stub.asInterface(holder.getBinder()); - } catch (CameraRuntimeException e) { - if (e.getReason() == CameraAccessException.CAMERA_DEPRECATED_HAL) { + if (supportsCamera2Api(cameraId)) { + // Use cameraservice's cameradeviceclient implementation for HAL3.2+ devices + mCameraService.connectDevice(callbacks, id, mContext.getPackageName(), + USE_CALLING_UID, holder); + cameraUser = ICameraDeviceUser.Stub.asInterface(holder.getBinder()); + } else { // Use legacy camera implementation for HAL1 devices Log.i(TAG, "Using legacy camera HAL."); cameraUser = CameraDeviceUserShim.connectBinderShim(callbacks, id); + } + } catch (CameraRuntimeException e) { + if (e.getReason() == CameraAccessException.CAMERA_DEPRECATED_HAL) { + throw new AssertionError("Should've gone down the shim path"); } else if (e.getReason() == CameraAccessException.CAMERA_IN_USE || e.getReason() == CameraAccessException.MAX_CAMERAS_IN_USE || e.getReason() == CameraAccessException.CAMERA_DISABLED || diff --git a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java index e4412ce..abd69c1 100644 --- a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java +++ b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java @@ -76,13 +76,11 @@ public class CameraDeviceUserShim implements ICameraDeviceUser { } // TODO: Move open/init into LegacyCameraDevice thread when API is switched to async. Camera legacyCamera = Camera.openUninitialized(); - int initErrors = legacyCamera.cameraInit(cameraId); + int initErrors = legacyCamera.cameraInitUnspecified(cameraId); + // Check errors old HAL initialization - if (Camera.checkInitErrors(initErrors)) { - // TODO: Map over old camera error codes. This likely involves improving the error - // reporting in the HAL1 connect path. - throw new CameraRuntimeException(CameraAccessException.CAMERA_DISCONNECTED); - } + CameraBinderDecorator.throwOnError(initErrors); + LegacyCameraDevice device = new LegacyCameraDevice(cameraId, legacyCamera, callbacks); return new CameraDeviceUserShim(cameraId, device); } |