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 3bb1c15..7c78c06 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 @@ -235,10 +235,15 @@ class PersistentCameraCaptureSession(private val cameraManager: CameraManager, p // 1. Run a precapture sequence for AF, AE and AWB. focusJob = coroutineScope.launch { - val request = repeatingRequest.createCaptureRequest(device, deviceDetails, outputs) - val options = - PrecaptureOptions(listOf(PrecaptureTrigger.AF, PrecaptureTrigger.AE), Flash.OFF, listOf(point), false, FOCUS_RESET_TIMEOUT) - session.precapture(request, deviceDetails, options) + try { + val request = repeatingRequest.createCaptureRequest(device, deviceDetails, outputs) + val options = + PrecaptureOptions(listOf(PrecaptureTrigger.AF, PrecaptureTrigger.AE), Flash.OFF, listOf(point), false, FOCUS_RESET_TIMEOUT) + session.precapture(request, deviceDetails, options) + } catch (e: CaptureTimedOutError) { + // Focus timed out - this is non-fatal, just log and continue + Log.w(TAG, "Focus timed out at point $point, continuing without focus lock") + } } focusJob?.join() diff --git a/package/android/src/main/java/com/mrousavy/camera/core/PreviewView.kt b/package/android/src/main/java/com/mrousavy/camera/core/PreviewView.kt index baa95cd..a46a94b 100644 --- a/package/android/src/main/java/com/mrousavy/camera/core/PreviewView.kt +++ b/package/android/src/main/java/com/mrousavy/camera/core/PreviewView.kt @@ -198,8 +198,10 @@ class PreviewView(context: Context, callback: SurfaceHolder.Callback) : val viewOrientation = Orientation.PORTRAIT val rotated = point.rotatedBy(viewSize, cameraSize, viewOrientation, sensorOrientation) - Log.i(TAG, "Converted layer point $point to camera point $rotated! ($sensorOrientation, $cameraSize -> $viewSize)") - return rotated + // Clamp to valid camera coordinates (must be non-negative for MeteringRectangle) + val clamped = Point(maxOf(0, rotated.x), maxOf(0, rotated.y)) + Log.i(TAG, "Converted layer point $point to camera point $clamped! ($sensorOrientation, $cameraSize -> $viewSize)") + return clamped } private fun updateLayout() {