From 26771acb7788986d91d2714fbc9b36f6cc6494d2 Mon Sep 17 00:00:00 2001 From: Sam S Date: Thu, 9 Feb 2017 18:02:32 -0800 Subject: [PATCH] Camera2: Fail gracefully if an exception occurs within a callback Before: app crashes if these exception occur --- .../google/android/cameraview/Camera2.java | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/library/src/main/api21/com/google/android/cameraview/Camera2.java b/library/src/main/api21/com/google/android/cameraview/Camera2.java index be7edc8a..8df37abe 100644 --- a/library/src/main/api21/com/google/android/cameraview/Camera2.java +++ b/library/src/main/api21/com/google/android/cameraview/Camera2.java @@ -61,7 +61,11 @@ class Camera2 extends CameraViewImpl { public void onOpened(@NonNull CameraDevice camera) { mCamera = camera; mCallback.onCameraOpened(); - startCaptureSession(); + try { + startCaptureSession(); + } catch (CameraAccessException e) { + Log.e(TAG, "Failed to start camera session", e); + } } @Override @@ -191,7 +195,11 @@ public void onImageAvailable(ImageReader reader) { mPreview.setCallback(new PreviewImpl.Callback() { @Override public void onSurfaceChanged() { - startCaptureSession(); + try { + startCaptureSession(); + } catch (CameraAccessException e) { + Log.e(TAG, "Failed to start camera session", e); + } } }); } @@ -261,7 +269,11 @@ boolean setAspectRatio(AspectRatio ratio) { if (mCaptureSession != null) { mCaptureSession.close(); mCaptureSession = null; - startCaptureSession(); + try { + startCaptureSession(); + } catch (CameraAccessException e) { + Log.e(TAG, "Failed to start camera session", e); + } } return true; } @@ -433,6 +445,7 @@ private void prepareImageReader() { *

Starts opening a camera device.

*

The result will be processed in {@link #mCameraDeviceCallback}.

*/ + @SuppressWarnings("MissingPermission") private void startOpeningCamera() { try { mCameraManager.openCamera(mCameraId, mCameraDeviceCallback, null); @@ -445,22 +458,20 @@ private void startOpeningCamera() { *

Starts a capture session for camera preview.

*

This rewrites {@link #mPreviewRequestBuilder}.

*

The result will be continuously processed in {@link #mSessionCallback}.

+ * + * @throws CameraAccessException exceptions from {@link Camera2} */ - void startCaptureSession() { + void startCaptureSession() throws CameraAccessException { if (!isCameraOpened() || !mPreview.isReady() || mImageReader == null) { return; } Size previewSize = chooseOptimalSize(); mPreview.setBufferSize(previewSize.getWidth(), previewSize.getHeight()); Surface surface = mPreview.getSurface(); - try { - mPreviewRequestBuilder = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); - mPreviewRequestBuilder.addTarget(surface); - mCamera.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), - mSessionCallback, null); - } catch (CameraAccessException e) { - throw new RuntimeException("Failed to start camera session"); - } + mPreviewRequestBuilder = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); + mPreviewRequestBuilder.addTarget(surface); + mCamera.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), + mSessionCallback, null); } /**