From 3f1a7c9e32e0a9c30298a3718e9a5b610b33f553 Mon Sep 17 00:00:00 2001 From: Marc Rousavy Date: Mon, 4 Mar 2024 12:49:03 +0100 Subject: [PATCH] fix: Disable precapture sequence by default (#2629) --- .../main/java/com/mrousavy/camera/CameraView+TakePhoto.kt | 2 ++ .../main/java/com/mrousavy/camera/core/CameraSession.kt | 4 +++- .../camera/core/PersistentCameraCaptureSession.kt | 6 ++++-- package/src/PhotoFile.ts | 8 ++++++++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/package/android/src/main/java/com/mrousavy/camera/CameraView+TakePhoto.kt b/package/android/src/main/java/com/mrousavy/camera/CameraView+TakePhoto.kt index 9098074..c09ae3f 100644 --- a/package/android/src/main/java/com/mrousavy/camera/CameraView+TakePhoto.kt +++ b/package/android/src/main/java/com/mrousavy/camera/CameraView+TakePhoto.kt @@ -32,6 +32,7 @@ suspend fun CameraView.takePhoto(optionsMap: ReadableMap): WritableMap { val flash = options["flash"] as? String ?: "off" val enableAutoStabilization = options["enableAutoStabilization"] == true val enableShutterSound = options["enableShutterSound"] as? Boolean ?: true + val enablePrecapture = options["enablePrecapture"] as? Boolean ?: false // TODO: Implement Red Eye Reduction options["enableAutoRedEyeReduction"] @@ -44,6 +45,7 @@ suspend fun CameraView.takePhoto(optionsMap: ReadableMap): WritableMap { flashMode, enableShutterSound, enableAutoStabilization, + enablePrecapture, orientation ) diff --git a/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt b/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt index 893199e..747270b 100644 --- a/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt +++ b/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt @@ -369,6 +369,7 @@ class CameraSession(private val context: Context, private val cameraManager: Cam flash: Flash, enableShutterSound: Boolean, enableAutoStabilization: Boolean, + enablePrecapture: Boolean, outputOrientation: Orientation ): CapturedPhoto { val photoOutput = photoOutput ?: throw PhotoNotEnabledError() @@ -380,7 +381,8 @@ class CameraSession(private val context: Context, private val cameraManager: Cam enableAutoStabilization, photoOutput.enableHdr, outputOrientation, - enableShutterSound + enableShutterSound, + enablePrecapture ) try { diff --git a/package/android/src/main/java/com/mrousavy/camera/core/PersistentCameraCaptureSession.kt b/package/android/src/main/java/com/mrousavy/camera/core/PersistentCameraCaptureSession.kt index 6162dc2..3bb1c15 100644 --- a/package/android/src/main/java/com/mrousavy/camera/core/PersistentCameraCaptureSession.kt +++ b/package/android/src/main/java/com/mrousavy/camera/core/PersistentCameraCaptureSession.kt @@ -145,7 +145,8 @@ class PersistentCameraCaptureSession(private val cameraManager: CameraManager, p enableAutoStabilization: Boolean, enablePhotoHdr: Boolean, orientation: Orientation, - enableShutterSound: Boolean + enableShutterSound: Boolean, + enablePrecapture: Boolean ): TotalCaptureResult { // Cancel any ongoing focus jobs focusJob?.cancel() @@ -169,7 +170,8 @@ class PersistentCameraCaptureSession(private val cameraManager: CameraManager, p val outputs = outputs val repeatingOutputs = outputs.filter { it.isRepeating } - if (qualityPrioritization == QualityPrioritization.SPEED && flash == Flash.OFF) { + val skipPrecapture = !enablePrecapture || qualityPrioritization == QualityPrioritization.SPEED + if (skipPrecapture && flash == Flash.OFF) { // 0. We want to take a picture as fast as possible, so skip any precapture sequence and just capture one Frame. Log.i(TAG, "Using fast capture path without pre-capture sequence...") val singleRequest = photoRequest.createCaptureRequest(device, deviceDetails, outputs) diff --git a/package/src/PhotoFile.ts b/package/src/PhotoFile.ts index 4c7e132..10d6f5b 100644 --- a/package/src/PhotoFile.ts +++ b/package/src/PhotoFile.ts @@ -44,6 +44,14 @@ export interface TakePhotoOptions { * @default true */ enableShutterSound?: boolean + /** + * Whether to run the pre-capture sequence to properly lock AF, AE and AWB values. + * Enabling this results in greater photos, but might not work on some devices. + * + * @platform Android + * @default false + */ + enablePrecapture?: boolean } /**