Android设备多摄像头场景下无法获取物理摄像头ID问题咨询
三星S21 Camera2 API物理摄像头ID获取与指定方案
问题根因
三星S21系列的相机HAL层做了厂商定制,默认状态下对三方应用隐藏物理摄像头ID,只有当对应的逻辑摄像头已创建激活CaptureSession后,才会允许读取物理ID列表,这是调用getPhysicalCameraIds()返回空的核心原因,不属于API调用错误。
可行解决方法
1. 调整查询时机获取物理ID
不要在相机初始化阶段直接查询,先完成逻辑摄像头的CaptureSession创建,配置至少一路可用输出Surface(比如预览Surface、ImageReader Surface),待会话onConfigured回调触发后,再调用逻辑摄像头CameraCharacteristics的getPhysicalCameraIds(),绝大多数S21机型在这个时机可以拿到完整的物理摄像头ID列表。
示例调用顺序参考:
// 第一步:先获取后置逻辑摄像头的CameraCharacteristics val characteristics = cameraManager.getCameraCharacteristics("0") // 第二步:初始化输出Surface,创建CaptureSession // 省略会话创建流程,待会话激活回调后再执行查询 val physicalIds = characteristics.physicalCameraIds
2. 遍历枚举所有摄像头ID匹配物理设备
如果调整时机后仍然返回空,可以直接遍历CameraManager.getCameraIdList()返回的所有ID,三星S21的物理摄像头ID通常为纯数字字符串,可通过参数区分类型:
- 查询
LENS_FACING参数判断前后置 - 查询
LENS_INFO_AVAILABLE_FOCAL_LENGTHS参数区分主摄、超广角、长焦 - 常规ID对应规则:ID2为后置超广角、ID3为后置长焦,可直接尝试调用
3. 指定物理摄像头输出的方法
拿到物理ID后,在创建CaptureRequest时通过setPhysicalCameraId()方法绑定对应物理摄像头,即可直接从该设备获取输出流:
CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); // 绑定物理摄像头ID builder.setPhysicalCameraId(physicalCameraId); builder.addSurface(previewSurface); captureSession.setRepeatingRequest(builder.build(), null, backgroundHandler);
注意事项
- 部分定制系统版本的S21会限制三方应用调用长焦物理摄像头,该场景下即使拿到ID也可能无法正常输出,可适配三星官方Camera SDK兼容
- 物理摄像头不支持单独打开,必须依托对应的逻辑摄像头会话使用
内容的提问来源于stack exchange,提问作者Rafeef Ziniya
相关产品推荐
相关产品推荐

