You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:36:05