Camera2 在 Android API 29 中用两个物理流替换一个逻辑流

Dud*_*ude 5 android android-camera2

当Android 9(API 28)发布时,我很高兴地发现具有多个摄像头的手机的物理摄像头将被暴露,我曾因无法访问它们而感到非常沮丧。今天我偶然发现了 android Q文档,其中写道:

从 API 级别 29 开始,部分或所有物理相机可能无法独立向应用程序公开,在这种情况下,物理相机 ID 在 CameraManager.getCameraIdList() 中将不可用。但应用程序仍然可以通过调用CameraManager.getCameraCharacteristics(String)来查询物理相机的特征。

这个说法让我很困惑,难道Android正在回溯吗?改变的目的是什么?

我对在非常精细的水平上管理相机感兴趣,这一变化是否会阻止我做我今天能够使用 Android 9 做的事情?

上面说可以不再列出ID,但是仍然可以查询特征,那么在没有ID的情况下如何获取摄像机的特征呢?我想我们应该通过getPhysicalCameraIds()逻辑摄像机获取物理摄像机的 ID,但这是否意味着如果我们想使用“隐藏”摄像机,我们就必须测试一堆随机 ID 字符串?

在此输入图像描述

我们是否仍然能够在未暴露的物理相机上使用SessionConfiguration创建捕获会话?

有人可以解释一下吗?

Ale*_*ohn 1

这不是走回头路。实际上,这种概括是让您更好地控制复杂相机设置的重要一步。

\n\n

在API 29之前,如果制造商无法为构成复合相机的每个镜头提供单独的cameraDevice ,他们就没有办法将镜头参数暴露给开发者。他们唯一的选择是将复合相机整体曝光。

\n\n

问题不是

\n\n
\n

我们是否仍然能够在未暴露的物理相机上使用 SessionConfiguration 创建捕获会话?

\n
\n\n

反而,

\n\n
\n

现在我们可以读取之前无法曝光的物理相机的特征\xe2\x80\xbc

\n
\n\n

通过新的更改,制造商可以为您提供有关“后置摄像头 1”、“后置摄像头 2”等的所有可用信息,即使无法在它们上启动单独的拍摄会话。

\n\n

getPhysicalCameraIds()参考说明:

\n\n
\n

在 API 级别 29 之前,所有返回的 ID 都保证由CameraManager.getCameraIdList()返回,并且可以直接由CameraManager.openCamera()打开。从 API 级别 29 开始,对于每个返回的 ID,如果它也由CameraManager.getCameraIdList()返回,则它可以被CameraManager.openCamera()用作独立相机。否则,摄像机ID只能作为当前逻辑摄像机的一部分。

\n
\n\n

这意味着您可以在CameraManager.getCameraCharacteristics(id)中使用getPhysicalCameraIds()返回的任何 id返回的任何 id :

\n\n
\n

从API级别29开始,该函数还可以用于查询只能用作逻辑多摄像头一部分的物理摄像头的功能。这些相机无法直接通过openCamera(String, CameraDevice.StateCallback, Handler)打开

\n
\n