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

如何在CameraController中设置setImageCaptureResolutionSelector及解决生效问题

CameraController设置拍照最高分辨率不生效的问题解决

问题分析

你遇到的核心问题有两个:

  1. 打印ResolutionSelector时仅显示对象标识:这是正常现象,因为ResolutionSelector类没有重写toString()方法,默认输出的是对象哈希值,不代表配置未生效。
  2. 实际拍照分辨率未达到相机支持的最大值:主要由配置顺序错误和多Use Case的分辨率兼容性限制导致。

具体原因

  • 配置顺序错误:你先调用setEnabledUseCases再设置分辨率选择器,LifecycleCameraController在启用Use Case时已完成相机初始化绑定,后续修改参数不会触发重新配置。
  • 多Use Case兼容性限制:同时启用IMAGE_CAPTURE和VIDEO_CAPTURE时,CameraX会自动选择两者都支持的最高兼容分辨率,而非单独拍照的最高分辨率。如果设备视频支持的最高分辨率低于拍照的,就会被限制在这个兼容值。

解决方案

1. 调整配置顺序

先设置分辨率选择器,再启用Use Cases,确保配置在相机初始化前生效:

val resolutionSelector = ResolutionSelector.Builder()
    .setResolutionStrategy(ResolutionStrategy.HIGHEST_AVAILABLE_STRATEGY)
    // 匹配相机最高分辨率的宽高比(3120x4160为4:3)
    .setAspectRatioStrategy(AspectRatioStrategy.RATIO_4_3_FALLBACK_AUTO_STRATEGY)
    .build()

val controller = remember {
    LifecycleCameraController(applicationContext).apply {
        // 先配置分辨率选择器
        setImageCaptureResolutionSelector(resolutionSelector)
        setImageCaptureMode(CAPTURE_MODE_MAXIMIZE_QUALITY)
        // 再启用Use Cases
        setEnabledUseCases(CameraController.IMAGE_CAPTURE or CameraController.VIDEO_CAPTURE)
    }
}

2. 优先保证拍照分辨率(可选)

如果视频录制不是必须的,单独启用IMAGE_CAPTURE,直接获取拍照的最高分辨率:

val controller = remember {
    LifecycleCameraController(applicationContext).apply {
        setImageCaptureResolutionSelector(resolutionSelector)
        setImageCaptureMode(CAPTURE_MODE_MAXIMIZE_QUALITY)
        // 仅启用拍照Use Case
        setEnabledUseCases(CameraController.IMAGE_CAPTURE)
    }
}

3. 验证实际分辨率

不要依赖ResolutionSelector的打印结果,通过拍照后的图片文件验证实际分辨率:

// 拍照时获取实际分辨率
controller.takePicture(
    ImageCapture.OutputFileOptions.Builder(File(context.filesDir, "photo.jpg")).build(),
    ContextCompat.getMainExecutor(context),
    object : ImageCapture.OnImageSavedCallback {
        override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
            val photoFile = File(outputFileResults.savedUri?.path ?: "")
            val options = BitmapFactory.Options().apply { inJustDecodeBounds = true }
            BitmapFactory.decodeFile(photoFile.path, options)
            Log.d("CameraX", "实际拍照分辨率:${options.outWidth}x${options.outHeight}")
        }

        override fun onError(exception: ImageCaptureException) {
            // 处理拍照错误
        }
    }
)

额外注意事项

  • 确保使用最新版本的CameraX依赖,旧版本可能存在分辨率配置的bug。
  • 如果必须同时启用拍照和视频,可通过CameraInfo查询设备支持的分辨率列表,手动选择两者兼容的最高值(需结合ProcessCameraProvider的API实现)。

内容的提问来源于stack exchange,提问作者garrettlynchirl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:02:34