Android CameraX调用setTargetResolution()无法获取指定分辨率的问题
解决方案
1. 用setTargetAspectRatio + setTargetSizeConstraints替代直接指定分辨率
CameraX不允许同时调用setTargetAspectRatio和setTargetResolution,可以通过锁定比例+限定尺寸范围的方式,既保证4:3比例,又要求设备返回高分辨率图像:
// 定义4:3比例的最小/目标分辨率范围 val min43Size = Size(1280, 960) val max43Size = Size(1600, 1200) // 可替换为设备支持的最大4:3分辨率 imageCapturer = ImageCapture.Builder() .setTargetAspectRatio(AspectRatio.RATIO_4_3) .setTargetSizeConstraints( SizeConstraints.Builder() .setMinWidth(min43Size.width) .setMinHeight(min43Size.height) .setMaxWidth(max43Size.width) .setMaxHeight(max43Size.height) .build() ) .setTargetRotation(fragmentCameraBinding.viewFinder.display.rotation) .setCaptureMode(CAPTURE_MODE_MINIMIZE_LATENCY) .build()
2. 正确获取ImageCapture支持的4:3分辨率
你之前调用CamcorderProfileResolutionQuirk获取的是预览分辨率,应该直接获取ImageCapture Use Case专属的支持分辨率,再筛选4:3比例的:
val cameraInfo = cameraProvider.getCameraInfo(cameraSelector) // 获取ImageCapture支持的所有分辨率 val captureSupportedSizes = cameraInfo.getSupportedResolutions(ImageCapture::class.java) // 筛选4:3比例(允许微小误差,避免设备精度问题) val ratio43Sizes = captureSupportedSizes.filter { size -> val aspect = size.width.toFloat() / size.height.toFloat() Math.abs(aspect - 4f/3f) < 0.01f } // 按分辨率从大到小排序,取最大的作为目标尺寸 ratio43Sizes.sortedByDescending { it.width * it.height }.firstOrNull()?.let { maxSize -> // 可将maxSize传入SizeConstraints的max参数 }
3. 升级CameraX到最新稳定版
部分旧版本CameraX在Nokia XR20这类设备上存在分辨率适配bug,建议更新依赖到最新稳定版:
// Module级build.gradle中更新依赖 dependencies { def camerax_version = "1.3.0" implementation "androidx.camera:camera-core:$camerax_version" implementation "androidx.camera:camera-camera2:$camerax_version" implementation "androidx.camera:camera-lifecycle:$camerax_version" implementation "androidx.camera:camera-view:$camerax_version" }
4. 适配设备特定Quirk
Nokia XR20可能存在CamcorderProfileResolutionQuirk,导致分辨率选择逻辑异常,可针对性调整:
val cameraCharacteristics = CameraCharacteristicsCompat.toCameraCharacteristicsCompat( Camera2CameraInfo.extractCameraCharacteristics(cameraInfo) ) if (cameraCharacteristics.isQuirk(CamcorderProfileResolutionQuirk::class.java)) { val quirk = cameraCharacteristics.getQuirk(CamcorderProfileResolutionQuirk::class.java) // 从quirk.supportedResolutions中筛选4:3分辨率使用 }
关键原因说明
Nokia XR20返回1944x1944是因为设备传感器原生为正方形,CameraX在未明确比例约束时,优先选择了传感器原生分辨率。通过setTargetAspectRatio锁定4:3比例+setTargetSizeConstraints限定范围,就能强制设备返回符合要求的图像。
内容的提问来源于stack exchange,提问作者antun
相关产品推荐
相关产品推荐

