我尝试使用以下方法为我的应用内相机实现广角选项CameraXapi 但遇到了一个问题 -CameraControl.setZoomRatio
允许设置缩放范围ZoomState.getMinZoomRatio()
and ZoomState.getMaxZoomRatio()
,我在手机上测试过它minZoomRatio
is 1.0f
。同款手机支持缩小至0.5f
在系统相机中。
当前片段我如何初始化相机:
private var camera: Camera? = null
private var imageCapture: ImageCapture? = null
private fun startCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(binding.viewFinder.surfaceProvider)
}
imageCapture = ImageCapture.Builder()
.setFlashMode(ImageCapture.FLASH_MODE_AUTO)
.build()
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
try {
cameraProvider.unbindAll()
camera = cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageCapture
)
viewModel.onCameraStarted()
} catch (exc: Exception) {
Timber.e(exc)
}
},
ContextCompat.getMainExecutor(this)
)
}
当前捏合缩放实现:
val scaleGestureDetector = ScaleGestureDetector(this,
object : ScaleGestureDetector.SimpleOnScaleGestureListener() {
override fun onScale(detector: ScaleGestureDetector): Boolean {
val camera = camera ?: return false
val zoomState = camera.cameraInfo.zoomState.value ?: return false
val scale = zoomState.zoomRatio * detector.scaleFactor
val finalScale =
scale.coerceIn(MIN_ZOOM, MAX_ZOOM).coerceIn(zoomState.minZoomRatio, zoomState.maxZoomRatio)
camera.cameraControl.setZoomRatio(finalScale)
return true
}
})
binding.viewFinder.setOnTouchListener { view, event ->
view.performClick()
scaleGestureDetector.onTouchEvent(event)
return@setOnTouchListener true
}
我的问题是可以使用广角相机(或实现0.5f
缩放)使用CameraXapi,或者我是否必须使用重写整个实现Camera2.
正如问题下面的评论中所解释的,广角镜头相机(以及任何其他相机,例如,如果我们尝试实现变焦 x20,则为大变焦)是单独的相机,因此为了允许在普通相机和(例如)广角镜头相机之间切换,我们必须使用不同的相机选择器重新启动相机视图。我们如何重新启动它,这取决于我们(例如,在某些捏合后重新启动或通过切换相机的按钮重新启动)。
这是相机选择器,可以根据需要获取后置摄像头或广角镜头后置摄像头startCameraData.ultraWide
param:
val cameraSelector = if (startCameraData.ultraWide) {
CameraSelector.Builder()
.addCameraFilter { cameraInfos ->
// filter back cameras with minimum sensor pixel size
val backCameras = cameraInfos.filterIsInstance<Camera2CameraInfoImpl>()
.filter {
val pixelWidth = it.cameraCharacteristicsCompat.get(CameraCharacteristics.SENSOR_INFO_PIXEL_ARRAY_SIZE)?.width ?: 0
it.lensFacing == CameraSelector.LENS_FACING_BACK && pixelWidth >= 2000 // arbitrary number resolved empirically
}
// try to find wide lens camera, if not present, default to general backCameras
backCameras.minByOrNull {
val focalLengths = it.cameraCharacteristicsCompat.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS)
focalLengths?.getOrNull(0) ?: 0f
}
?.let { listOf(it) } ?: backCameras
}
.build()
} else {
CameraSelector.DEFAULT_BACK_CAMERA
}
Note:Camera2 api 可能无法让我们访问某些相机(具体取决于手机),但有时也会,除非应用程序包被 Google 列入白名单。例如打开相机应用程序(net.sourceforge.opencamera
)已列入白名单,并且可以访问所有摄像机。
我通过将应用程序包更改为来测试这一点net.sourceforge.opencamera
突然得到了 6 个相机 ID,而不是 3 个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)