summaryrefslogtreecommitdiffstats
path: root/core/java/android
diff options
context:
space:
mode:
authorEino-Ville Talvala <etalvala@google.com>2014-09-23 16:37:31 -0700
committerEino-Ville Talvala <etalvala@google.com>2014-09-25 14:06:55 -0700
commiteecc904f13e7a105f5548c953e4caa306fe06f0d (patch)
tree6d0b4fe3e76c0ced68d45e4d49571435f867f727 /core/java/android
parent33ae07ab814df0242625bb1e1961f464b630a7fe (diff)
downloadframeworks_base-eecc904f13e7a105f5548c953e4caa306fe06f0d.zip
frameworks_base-eecc904f13e7a105f5548c953e4caa306fe06f0d.tar.gz
frameworks_base-eecc904f13e7a105f5548c953e4caa306fe06f0d.tar.bz2
Camera2 legacy: Improve robustness to camera service crashes
When the camera service dies, the getParameters call is often the first to fail, and on legacy mode, this frequently happens in a background thread. Catch the runtime exceptions and convert to device errors, instead of killing the process. Bug: 17587496 Change-Id: I6757961e7c0387defd368a13cb7c343950602400
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java10
-rw-r--r--core/java/android/hardware/camera2/legacy/RequestThreadManager.java18
2 files changed, 25 insertions, 3 deletions
diff --git a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java
index e19f587..fcf172c 100644
--- a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java
+++ b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java
@@ -336,8 +336,16 @@ public class CameraDeviceUserShim implements ICameraDeviceUser {
CameraInfo info = new CameraInfo();
Camera.getCameraInfo(cameraId, info);
+ Camera.Parameters legacyParameters = null;
+ try {
+ legacyParameters = legacyCamera.getParameters();
+ } catch (RuntimeException e) {
+ throw new CameraRuntimeException(CameraAccessException.CAMERA_ERROR,
+ "Unable to get initial parameters", e);
+ }
+
CameraCharacteristics characteristics =
- LegacyMetadataMapper.createCharacteristics(legacyCamera.getParameters(), info);
+ LegacyMetadataMapper.createCharacteristics(legacyParameters, info);
LegacyCameraDevice device = new LegacyCameraDevice(
cameraId, legacyCamera, characteristics, threadCallbacks);
return new CameraDeviceUserShim(cameraId, device, characteristics, init, threadCallbacks);
diff --git a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
index d27ca14..3b41359 100644
--- a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
+++ b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
@@ -356,7 +356,14 @@ public class RequestThreadManager {
}
}
}
- mParams = mCamera.getParameters();
+ try {
+ mParams = mCamera.getParameters();
+ } catch (RuntimeException e) {
+ Log.e(TAG, "Received device exception: ", e);
+ mDeviceState.setError(
+ CameraDeviceImpl.CameraDeviceCallbacks.ERROR_CAMERA_DEVICE);
+ return;
+ }
List<int[]> supportedFpsRanges = mParams.getSupportedPreviewFpsRange();
int[] bestRange = getPhotoPreviewFpsRange(supportedFpsRanges);
@@ -780,7 +787,14 @@ public class RequestThreadManager {
if (DEBUG) {
Log.d(TAG, "Params changed -- getting new Parameters from HAL.");
}
- mParams = mCamera.getParameters();
+ try {
+ mParams = mCamera.getParameters();
+ } catch (RuntimeException e) {
+ Log.e(TAG, "Received device exception: ", e);
+ mDeviceState.setError(
+ CameraDeviceImpl.CameraDeviceCallbacks.ERROR_CAMERA_DEVICE);
+ break;
+ }
// Update parameters to the latest that we think the camera is using
mLastRequest.setParameters(mParams);