修复部分机型无法切换广角和主摄功能
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.CaptureRequestOptions
|
||||||
import androidx.camera.camera2.interop.ExperimentalCamera2Interop
|
import androidx.camera.camera2.interop.ExperimentalCamera2Interop
|
||||||
import androidx.camera.core.Camera
|
import androidx.camera.core.Camera
|
||||||
|
import androidx.camera.core.CameraControl
|
||||||
import androidx.camera.core.CameraSelector
|
import androidx.camera.core.CameraSelector
|
||||||
import androidx.camera.core.Preview
|
import androidx.camera.core.Preview
|
||||||
import androidx.camera.lifecycle.ProcessCameraProvider
|
import androidx.camera.lifecycle.ProcessCameraProvider
|
||||||
@@ -24,6 +25,7 @@ import androidx.camera.view.PreviewView
|
|||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.lifecycle.LifecycleOwner
|
import androidx.lifecycle.LifecycleOwner
|
||||||
import java.util.concurrent.Executor
|
import java.util.concurrent.Executor
|
||||||
|
import java.util.concurrent.ExecutionException
|
||||||
import kotlin.math.atan
|
import kotlin.math.atan
|
||||||
import kotlin.math.round
|
import kotlin.math.round
|
||||||
|
|
||||||
@@ -247,7 +249,7 @@ class RecordingCameraController(
|
|||||||
if (currentLensMode == LensMode.ULTRA_WIDE) {
|
if (currentLensMode == LensMode.ULTRA_WIDE) {
|
||||||
ultraWideZoomRatio
|
ultraWideZoomRatio
|
||||||
} else {
|
} else {
|
||||||
(zoomState?.zoomRatio ?: currentZoomRatio).coerceIn(minZoom, maxZoom)
|
currentZoomRatio.coerceIn(minZoom, maxZoom)
|
||||||
}
|
}
|
||||||
currentZoomRatio = zoom
|
currentZoomRatio = zoom
|
||||||
Log.d(
|
Log.d(
|
||||||
@@ -313,8 +315,17 @@ class RecordingCameraController(
|
|||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
future.get()
|
future.get()
|
||||||
onComplete(true, zoomCapabilitiesMap(), null)
|
val capabilities = zoomCapabilitiesMap()
|
||||||
|
logSetZoomResult(ratio, nextZoom, capabilities)
|
||||||
|
onComplete(true, capabilities, null)
|
||||||
} catch (error: Exception) {
|
} 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)
|
Log.e(TAG, "setZoomRatio failed", error)
|
||||||
onComplete(false, zoomCapabilitiesMap(), error.message)
|
onComplete(false, zoomCapabilitiesMap(), error.message)
|
||||||
}
|
}
|
||||||
@@ -706,6 +717,29 @@ class RecordingCameraController(
|
|||||||
.build(),
|
.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 {
|
private fun selectorForCurrentLensMode(): CameraSelector {
|
||||||
val cameraId =
|
val cameraId =
|
||||||
if (currentLensMode == LensMode.ULTRA_WIDE) {
|
if (currentLensMode == LensMode.ULTRA_WIDE) {
|
||||||
|
|||||||
Reference in New Issue
Block a user