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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:45:00