修复部分机型无法切换广角和主摄功能
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user