diff options
| author | Eino-Ville Talvala <etalvala@google.com> | 2014-09-23 16:37:31 -0700 |
|---|---|---|
| committer | Eino-Ville Talvala <etalvala@google.com> | 2014-09-25 14:06:55 -0700 |
| commit | eecc904f13e7a105f5548c953e4caa306fe06f0d (patch) | |
| tree | 6d0b4fe3e76c0ced68d45e4d49571435f867f727 /core | |
| parent | 33ae07ab814df0242625bb1e1961f464b630a7fe (diff) | |
| download | frameworks_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')
| -rw-r--r-- | core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java | 10 | ||||
| -rw-r--r-- | core/java/android/hardware/camera2/legacy/RequestThreadManager.java | 18 |
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); |
