CameraX setTargetResolution()在部分设备配置不生效问题咨询
三星A7设备CameraX目标分辨率不生效的原因及解决方法
核心原因
CameraX的分辨率匹配并非直接选择你传入的目标尺寸,而是遵循平台规则结合设备特性共同作用,导致你遇到的问题:
- 多 UseCase 公共集合过滤:你代码中仅展示了绑定ImageAnalysis,若实际还绑定了Preview、ImageCapture等其他用例,CameraX会先筛选所有绑定用例都支持的公共分辨率集合,再从集合中选择不小于目标分辨率、宽高比和目标分辨率一致的最小可用尺寸。你传入的176x144宽高比为11:9,最终输出的720x720为1:1,说明公共分辨率集合中没有符合11:9要求的可用尺寸,触发了回退逻辑。
- 尺寸方向不匹配:CameraX的目标分辨率尺寸默认和传感器自然方向对齐,而非当前应用的显示方向。如果你传入的
Size(176,144)是横屏比例,竖屏设备会自动互换宽高为144x176进行匹配,你提供的支持列表中不存在144x176的尺寸,导致匹配失败。 - 格式匹配错误:你调用
StreamConfigurationMap.getOutputSizes()查询时如果未指定ImageFormat.YUV_420_888格式(ImageAnalysis用例默认使用该格式),查询到的是JPEG等其他格式的支持列表,176x144可能并不在YUV格式的支持列表中。 - 三星设备兼容性问题:部分旧版CameraX库对三星设备的HAL层适配存在bug,小分辨率的匹配逻辑会被厂商的自定义规则拦截,强制选择更高的默认分辨率。
解决方法
- 确认是否同时绑定了其他用例,若有,给所有用例统一设置和176x144一致的11:9宽高比,避免公共分辨率集合被过滤。
- 调换目标分辨率的宽高参数,传入
Size(144, 176)尝试匹配。 - 重新查询
StreamConfigurationMap.getOutputSizes(ImageFormat.YUV_420_888),确认176x144确实在YUV格式的支持列表中。 - 升级CameraX库到最新稳定版,修复旧版本的设备适配问题。
- 若以上方案都不生效,可以通过Camera2 Interop扩展强制指定输出尺寸:
val camera2Extender = Camera2Interop.Extender(imageAnalysis) camera2Extender.setSurfaceRequest { request -> val supportedSizes = request.supportedSizes // 手动选择176x144的尺寸 val targetSize = supportedSizes.firstOrNull { it.width == 176 && it.height == 144 } ?: supportedSizes.first() val texture = SurfaceTexture(0).apply { setDefaultBufferSize(targetSize.width, targetSize.height) } request.provideSurface(Surface(texture), Runnable { texture.release() }) }
内容的提问来源于stack exchange,提问作者Greelings
相关产品推荐
相关产品推荐

