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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Camera2用Android API 29中的两个物理流替换一个逻辑流相关的知识,希望对你有一定的参考价值。

android 9(API 28)发布时,我很高兴地发现带有多个摄像头的手机的物理摄像头会暴露出来,我一直非常沮丧,无法访问它们。今天我偶然发现了机器人Q documentation,它说:

从API级别29开始,部分或全部物理相机可能无法独立地暴露给应用程序,在这种情况下,物理相机ID将无法在CameraManager.getCameraIdList()中使用。但是应用程序仍然可以通过调用CameraManager.getCameraCharacteristics(String)来查询物理相机的特性。

这句话让我困惑,这是否意味着Android正在回溯?变化的目的是什么?

我对在很好的水平上管理相机很感兴趣,这种改变会阻止我做今天用Android 9做的事情吗?

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

enter image description here

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

有人可以对此有所了解吗?

答案

这不是回溯。实际上,这种概括是一个重要的步骤,可以让您更好地控制复杂的相机设置。

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

问题不是

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

反而,

现在我们可以阅读以前无法曝光的物理相机的特性!

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

getPhysicalCameraIds()参考解释:

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

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

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

以上是关于Camera2用Android API 29中的两个物理流替换一个逻辑流的主要内容,如果未能解决你的问题,请参考以下文章

Android Camera2 API 设置自定义亮度、对比度、伽玛

android中的camera和camera2权限

如何在android studio中获取camera2 api中的每一帧,例如camera api中的PreviewCallback和camerax中的ImageAnalysis.Analyzer?

只有一个带有 Camera2 和旧相机 API 的 APK

如何使用Android中的Camera2 API在不预览的情况下拍摄多张照片?

调用需要 API 级别 21(当前最低为 17):android.hardware.camera2.CameraDevice.StateCallback