修复部分机型无法切换广角和主摄功能

This commit is contained in:
2026-06-30 17:06:35 +08:00
parent 6d93c1c8dd
commit 23319cfddb
@@ -11,6 +11,7 @@ import androidx.camera.camera2.interop.Camera2CameraInfo
import androidx.camera.camera2.interop.CaptureRequestOptions
import androidx.camera.camera2.interop.ExperimentalCamera2Interop
import androidx.camera.core.Camera
import androidx.camera.core.CameraControl
import androidx.camera.core.CameraSelector
import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider
@@ -24,6 +25,7 @@ import androidx.camera.view.PreviewView
import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner
import java.util.concurrent.Executor
import java.util.concurrent.ExecutionException
import kotlin.math.atan
import kotlin.math.round
@@ -247,7 +249,7 @@ class RecordingCameraController(
if (currentLensMode == LensMode.ULTRA_WIDE) {
ultraWideZoomRatio
} else {
(zoomState?.zoomRatio ?: currentZoomRatio).coerceIn(minZoom, maxZoom)
currentZoomRatio.coerceIn(minZoom, maxZoom)
}
currentZoomRatio = zoom
Log.d(
@@ -313,8 +315,17 @@ class RecordingCameraController(
{
try {
future.get()
onComplete(true, zoomCapabilitiesMap(), null)
val capabilities = zoomCapabilitiesMap()
logSetZoomResult(ratio, nextZoom, capabilities)
onComplete(true, capabilities, null)
} catch (error: Exception) {
if (isSupersededCamera2ZoomRequest(error)) {
Log.d(TAG, "setZoomRatio superseded by newer Camera2 options")
val capabilities = zoomCapabilitiesMap()
logSetZoomResult(ratio, nextZoom, capabilities)
onComplete(true, capabilities, null)
return@addListener
}
Log.e(TAG, "setZoomRatio failed", error)
onComplete(false, zoomCapabilitiesMap(), error.message)
}
@@ -706,6 +717,29 @@ class RecordingCameraController(
.build(),
)
private fun isSupersededCamera2ZoomRequest(error: Exception): Boolean {
val cause =
if (error is ExecutionException) {
error.cause
} else {
error
}
return cause is CameraControl.OperationCanceledException &&
cause.message?.contains("updated with new options") == true
}
private fun logSetZoomResult(
requestedRatio: Double,
nextZoom: Float,
capabilities: Map<String, Any>,
) {
Log.d(
TAG,
"setZoomRatio result requestedRatio=$requestedRatio nextZoom=$nextZoom " +
"currentZoomRatio=$currentZoomRatio returnedZoom=${capabilities["zoomRatio"]}",
)
}
private fun selectorForCurrentLensMode(): CameraSelector {
val cameraId =
if (currentLensMode == LensMode.ULTRA_WIDE) {