我尝试使用
Pixel 5(Android 11)第一个逻辑后置摄像头的物理 ID 打开相机,但出现错误:未知的相机 ID...。
因此,
Pixel 5 只返回了 2 个逻辑相机 ID,并且只有这两个相机可以使用
cameraManager.openCamera(...)
方法打开...
Samsung S10(也是 Android 11)返回 4 个逻辑相机 ID,并且没有任何逻辑相机的物理相机 ID,所有 4 个相机都可以正常使用。
Pixel 5 相机信息:
![enter image description here](https://istack.dev59.com/OSygQ.webp)
三星S10 相机信息:
![enter image description here](https://istack.dev59.com/nfcNg.webp)
虽然我没有尝试过在Pixel 5上使用setPhysicalCameraId(cameraId)
https://developer.android.com/reference/android/hardware/camera2/params/OutputConfiguration.html#setPhysicalCameraId(java.lang.String),但我认为这种方法可以用于在不同的物理相机之间切换(例如,我们可以打开广角相机)
更新
是的,我们可以在Pixel 4、5(以及我猜测还有更多设备和制造商)中使用setPhysicalCameraId
方法来设置特定的物理相机
所以逻辑如下:
您使用相机管理器使用逻辑相机ID打开相机
然后,如果该逻辑相机支持多摄像头功能,则其应具有非空的物理相机ID列表
您可以从物理相机ID列表中选择任何ID并将其设置为OutputConfiguration
:
val outputs = surfaces.map {
OutputConfiguration(it).apply {
setPhysicalCameraId(cameraIdx)
}
}
cameraDevice.createCaptureSessionByOutputConfigurations(
outputs,
stateCallback,
backgroundCameraHandler
)
更新!警告!但是它预览相同的视图,所以看起来这种方法不起作用(尽管没有异常),无论您是否设置物理相机都没有改变。
似乎从Android 10开始出现问题-{{link1:Android 10(api 29)camera2 api regression with wide-angle camera}}。
更新
我还尝试使用SessionConfiguration
对象创建捕获会话,而不是过时的方法createCaptureSessionByOutputConfigurations
val config = SessionConfiguration(
SessionConfiguration.SESSION_REGULAR,
outputs,
backgroundCameraExecutor!!,
stateCallback
)
cameraDevice.createCaptureSession(config)
但仍然没有改变
camChars.availablePhysicalCameraRequestKeys
和setPhysicalCameraKey
有关。 - user25