@@ -512,8 +512,10 @@ class Camera2ApiManager(context: Context) {
512512 fun enableWhiteBalanceLock (): Boolean {
513513 val characteristics = cameraCharacteristics ? : return false
514514 val builderInputSurface = this .builderInputSurface ? : return false
515- val available = characteristics.secureGet(CameraCharacteristics .CONTROL_AWB_LOCK_AVAILABLE ) ? : return false
516- if (! available) return false
515+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ) {
516+ val available = characteristics.secureGet(CameraCharacteristics .CONTROL_AWB_LOCK_AVAILABLE ) ? : return false
517+ if (! available) return false
518+ }
517519 builderInputSurface.set(CaptureRequest .CONTROL_AWB_LOCK , true )
518520 isWhiteBalanceLockEnabled = applyRequest(builderInputSurface)
519521 return isWhiteBalanceLockEnabled
@@ -603,24 +605,30 @@ class Camera2ApiManager(context: Context) {
603605 return supportedExposure
604606 }
605607
606- fun tapToFocus (view : View , event : MotionEvent ): Boolean {
607- val builderInputSurface = this .builderInputSurface ? : return false
608- val characteristics = cameraCharacteristics ? : return false
609- val session = cameraCaptureSession ? : return false
610- if (characteristics.get(CameraCharacteristics .CONTROL_MAX_REGIONS_AF ) == 0 ) return false
611- val focusTag = " focus"
612- val sensorArraySize = characteristics.get(CameraCharacteristics .SENSOR_INFO_ACTIVE_ARRAY_SIZE ) ? : return false
608+ private fun getTapRect (view : View , event : MotionEvent ): MeteringRectangle ? {
609+ val characteristics = cameraCharacteristics ? : return null
610+ val sensorArraySize = characteristics.secureGet(CameraCharacteristics .SENSOR_INFO_ACTIVE_ARRAY_SIZE ) ? : return null
611+
613612 val x = event.x
614613 val y = event.y
615614 val focusX = (x / view.width.toFloat()) * sensorArraySize.width()
616615 val focusY = (y / view.height.toFloat()) * sensorArraySize.height()
617- val focusRect = MeteringRectangle (
616+ return MeteringRectangle (
618617 (focusX - 100 ).toInt().coerceIn(0 , sensorArraySize.width()),
619618 (focusY - 100 ).toInt().coerceIn(0 , sensorArraySize.height()),
620619 (100 * 2 ).coerceIn(0 , sensorArraySize.width()),
621620 (100 * 2 ).coerceIn(0 , sensorArraySize.height()),
622621 MeteringRectangle .METERING_WEIGHT_MAX
623622 )
623+ }
624+
625+ fun tapToFocus (view : View , event : MotionEvent ): Boolean {
626+ val builderInputSurface = this .builderInputSurface ? : return false
627+ val session = cameraCaptureSession ? : return false
628+ val characteristics = cameraCharacteristics ? : return false
629+ if ((characteristics.secureGet(CameraCharacteristics .CONTROL_MAX_REGIONS_AF ) ? : 0 ) == 0 ) return false
630+ val focusRect = getTapRect(view, event) ? : return false
631+ val focusTag = " focus"
624632
625633 val captureCallbackHandler: CameraCaptureSession .CaptureCallback =
626634 object : CameraCaptureSession .CaptureCallback () {
@@ -663,21 +671,11 @@ class Camera2ApiManager(context: Context) {
663671 * @return true if successful, false otherwise
664672 */
665673 fun tapToMeterExposure (view : View , event : MotionEvent ): Boolean {
674+ if (isExposureLockEnabled) return false
666675 val builderInputSurface = this .builderInputSurface ? : return false
667676 val characteristics = cameraCharacteristics ? : return false
668- if (characteristics.get(CameraCharacteristics .CONTROL_MAX_REGIONS_AE ) == 0 ) return false
669-
670- val sensorArraySize = characteristics.get(CameraCharacteristics .SENSOR_INFO_ACTIVE_ARRAY_SIZE ) ? : return false
671- val regionX = (event.x / view.width.toFloat()) * sensorArraySize.width()
672- val regionY = (event.y / view.height.toFloat()) * sensorArraySize.height()
673-
674- val aeRect = MeteringRectangle (
675- (regionX - 100 ).toInt().coerceIn(0 , sensorArraySize.width()),
676- (regionY - 100 ).toInt().coerceIn(0 , sensorArraySize.height()),
677- (100 * 2 ).coerceIn(0 , sensorArraySize.width()),
678- (100 * 2 ).coerceIn(0 , sensorArraySize.height()),
679- MeteringRectangle .METERING_WEIGHT_MAX
680- )
677+ if ((characteristics.secureGet(CameraCharacteristics .CONTROL_MAX_REGIONS_AE ) ? : 0 ) == 0 ) return false
678+ val aeRect = getTapRect(view, event) ? : return false
681679
682680 return try {
683681 builderInputSurface.set(CaptureRequest .CONTROL_AE_REGIONS , arrayOf(aeRect))
@@ -698,21 +696,11 @@ class Camera2ApiManager(context: Context) {
698696 * @return true if successful, false otherwise
699697 */
700698 fun tapToMeterWhiteBalance (view : View , event : MotionEvent ): Boolean {
699+ if (isWhiteBalanceLockEnabled) return false
701700 val builderInputSurface = this .builderInputSurface ? : return false
702701 val characteristics = cameraCharacteristics ? : return false
703- if (characteristics.get(CameraCharacteristics .CONTROL_MAX_REGIONS_AWB ) == 0 ) return false
704-
705- val sensorArraySize = characteristics.get(CameraCharacteristics .SENSOR_INFO_ACTIVE_ARRAY_SIZE ) ? : return false
706- val regionX = (event.x / view.width.toFloat()) * sensorArraySize.width()
707- val regionY = (event.y / view.height.toFloat()) * sensorArraySize.height()
708-
709- val awbRect = MeteringRectangle (
710- (regionX - 100 ).toInt().coerceIn(0 , sensorArraySize.width()),
711- (regionY - 100 ).toInt().coerceIn(0 , sensorArraySize.height()),
712- (100 * 2 ).coerceIn(0 , sensorArraySize.width()),
713- (100 * 2 ).coerceIn(0 , sensorArraySize.height()),
714- MeteringRectangle .METERING_WEIGHT_MAX
715- )
702+ if ((characteristics.secureGet(CameraCharacteristics .CONTROL_MAX_REGIONS_AWB ) ? : 0 ) == 0 ) return false
703+ val awbRect = getTapRect(view, event) ? : return false
716704
717705 return try {
718706 builderInputSurface.set(CaptureRequest .CONTROL_AWB_REGIONS , arrayOf(awbRect))
@@ -1065,6 +1053,8 @@ class Camera2ApiManager(context: Context) {
10651053
10661054 @JvmOverloads
10671055 fun closeCamera (resetSurface : Boolean = true) {
1056+ isExposureLockEnabled = false
1057+ isWhiteBalanceLockEnabled = false
10681058 isLanternEnabled = false
10691059 zoomLevel = 1.0f
10701060 cameraCaptureSession?.close()
0 commit comments