From 639857eda6eebcb5321f71a5eb063150a517e3c1 Mon Sep 17 00:00:00 2001 From: Mattia Iavarone Date: Sat, 14 Dec 2019 18:16:56 +0100 Subject: [PATCH] Call both stopRepeating and abortCaptures --- .../otaliastudios/cameraview/CameraView.java | 19 +++++++++---------- .../cameraview/engine/Camera2Engine.java | 10 ++++++---- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index 8d972451..f7147f5a 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -411,22 +411,20 @@ public class CameraView extends FrameLayout implements LifecycleObserver { return; } - Size previewSize = mCameraEngine.getPreviewStreamSize(Reference.VIEW); - if (previewSize == null) { + mLastPreviewStreamSize = mCameraEngine.getPreviewStreamSize(Reference.VIEW); + if (mLastPreviewStreamSize == null) { LOG.w("onMeasure:", "surface is not ready. Calling default behavior."); super.onMeasure(widthMeasureSpec, heightMeasureSpec); - mLastPreviewStreamSize = null; return; } - mLastPreviewStreamSize = previewSize; // Let's which dimensions need to be adapted. int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); final int widthValue = MeasureSpec.getSize(widthMeasureSpec); final int heightValue = MeasureSpec.getSize(heightMeasureSpec); - final float previewWidth = previewSize.getWidth(); - final float previewHeight = previewSize.getHeight(); + final float previewWidth = mLastPreviewStreamSize.getWidth(); + final float previewHeight = mLastPreviewStreamSize.getHeight(); // Pre-process specs final ViewGroup.LayoutParams lp = getLayoutParams(); @@ -441,10 +439,11 @@ public class CameraView extends FrameLayout implements LifecycleObserver { if (heightMode == AT_MOST && lp.height == MATCH_PARENT) heightMode = EXACTLY; } - LOG.i("onMeasure:", "requested dimensions are (" + widthValue + "[" + ms(widthMode) - + "]x" + heightValue + "[" + ms(heightMode) + "])"); - LOG.i("onMeasure:", "previewSize is", "(" + previewWidth + "x" - + previewHeight + ")"); + LOG.i("onMeasure:", "requested dimensions are (" + + widthValue + "[" + ms(widthMode) + "]x" + + heightValue + "[" + ms(heightMode) + "])"); + LOG.i("onMeasure:", "previewSize is", "(" + + previewWidth + "x" + previewHeight + ")"); // (1) If we have fixed dimensions (either 300dp or MATCH_PARENT), there's nothing we // should do, other than respect it. The preview will eventually be cropped at the sides diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java index a9d668dc..75a734ed 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java @@ -583,7 +583,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv @NonNull @Override protected Task onStartPreview() { - LOG.i("onStartPreview", "Dispatching onCameraPreviewStreamSizeChanged."); + LOG.i("onStartPreview:", "Dispatching onCameraPreviewStreamSizeChanged."); mCallback.onCameraPreviewStreamSizeChanged(); Size previewSizeForView = getPreviewStreamSize(Reference.VIEW); @@ -596,11 +596,11 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv getFrameManager().setUp(FRAME_PROCESSING_FORMAT, mFrameProcessingSize); } - LOG.i("onStartPreview", "Starting preview."); + LOG.i("onStartPreview:", "Starting preview."); addRepeatingRequestBuilderSurfaces(); applyRepeatingRequestBuilder(false, CameraException.REASON_FAILED_TO_START_PREVIEW); - LOG.i("onStartPreview", "Started preview."); + LOG.i("onStartPreview:", "Started preview."); // Start delayed video if needed. if (mFullVideoPendingStub != null) { @@ -642,8 +642,10 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv // Preferring this over stopRepeating() so we're sure that all in-flights operations // are discarded as fast as possible, which is exactly what we want. // NOTE: this call is asynchronous. Should find a good way to wait for the outcome. - LOG.i("onStopPreview:", "calling abortCaptures()."); + LOG.i("onStopPreview:", "calling stopRepeating()."); // TODO HANGS (rare, emulator only) + mSession.stopRepeating(); + LOG.i("onStopPreview:", "calling abortCaptures()."); mSession.abortCaptures(); LOG.i("onStopPreview:", "called abortCaptures()."); } catch (CameraAccessException e) {