From 5d432e70dbaf212ad427c6ee7b6a35513a15c131 Mon Sep 17 00:00:00 2001 From: mkotyk Date: Tue, 11 Apr 2017 15:10:50 -0400 Subject: [PATCH] - Catch runtime exceptions around camera1 takePicture and attempt to recover --- .../google/android/cameraview/Camera1.java | 23 +++++++++++-------- .../android/cameraview/CameraViewImpl.java | 1 + .../google/android/cameraview/CameraView.java | 16 +++++++++++++ 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/library/src/main/api14/com/google/android/cameraview/Camera1.java b/library/src/main/api14/com/google/android/cameraview/Camera1.java index 1830c185..5d44f214 100644 --- a/library/src/main/api14/com/google/android/cameraview/Camera1.java +++ b/library/src/main/api14/com/google/android/cameraview/Camera1.java @@ -238,15 +238,20 @@ public void onAutoFocus(boolean success, Camera camera) { void takePictureInternal() { if (!isPictureCaptureInProgress.getAndSet(true)) { - mCamera.takePicture(null, null, null, new Camera.PictureCallback() { - @Override - public void onPictureTaken(byte[] data, Camera camera) { - isPictureCaptureInProgress.set(false); - mCallback.onPictureTaken(data); - camera.cancelAutoFocus(); - camera.startPreview(); - } - }); + try { + mCamera.takePicture(null, null, null, new Camera.PictureCallback() { + @Override + public void onPictureTaken(byte[] data, Camera camera) { + isPictureCaptureInProgress.set(false); + mCallback.onPictureTaken(data); + camera.cancelAutoFocus(); + camera.startPreview(); + } + }); + } + catch (RuntimeException ex) { + mCallback.onTakePictureFailed(ex); + } } } diff --git a/library/src/main/base/com/google/android/cameraview/CameraViewImpl.java b/library/src/main/base/com/google/android/cameraview/CameraViewImpl.java index 31dab0c4..e9a0332f 100644 --- a/library/src/main/base/com/google/android/cameraview/CameraViewImpl.java +++ b/library/src/main/base/com/google/android/cameraview/CameraViewImpl.java @@ -77,6 +77,7 @@ interface Callback { void onPictureTaken(byte[] data); + void onTakePictureFailed(Throwable throwable); } } diff --git a/library/src/main/java/com/google/android/cameraview/CameraView.java b/library/src/main/java/com/google/android/cameraview/CameraView.java index 04826d84..3d6bd3db 100644 --- a/library/src/main/java/com/google/android/cameraview/CameraView.java +++ b/library/src/main/java/com/google/android/cameraview/CameraView.java @@ -449,6 +449,13 @@ public void onPictureTaken(byte[] data) { } } + @Override + public void onTakePictureFailed(Throwable throwable) { + for (Callback callback : mCallbacks) { + callback.onTakePictureFailed(CameraView.this, throwable); + } + } + public void reserveRequestLayoutOnOpen() { mRequestLayoutOnOpen = true; } @@ -535,6 +542,15 @@ public void onCameraClosed(CameraView cameraView) { */ public void onPictureTaken(CameraView cameraView, byte[] data) { } + + /** + * Called when taking a picture has failed + * + * @param cameraView The associated {@link CameraView}. + * @param throwable Exception + */ + public void onTakePictureFailed(CameraView cameraView, Throwable throwable) { + } } }