summaryrefslogtreecommitdiffstats
path: root/core/java/android/hardware
diff options
context:
space:
mode:
authorIgor Murashkin <iam@google.com>2014-06-20 21:21:38 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-06-20 18:26:34 +0000
commit60679f6b7d45c45be5bd0a44026711890f6ff291 (patch)
treea798db34ee5e771a339ec07f9de84fc246335351 /core/java/android/hardware
parentb127713b58c1a8f8bae687742ef15e60b3dbeb44 (diff)
parenta1d662716b3da384dfe3a758f079e0cbd089784a (diff)
downloadframeworks_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.java84
-rw-r--r--core/java/android/hardware/camera2/CameraManager.java15
-rw-r--r--core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java10
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);
}