当前位置: 首页 > 知识库问答 >
问题:

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

管炳
2023-03-14

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

从API级别29开始,部分或全部物理摄像机可能不会独立地暴露给应用程序,在这种情况下,物理摄像机ID将无法在相机anager.get相机列表()中使用。但是应用程序仍然可以通过调用相机anager.get相机特征(字符串)来查询物理摄像机的特征。

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

我有兴趣在一个非常好的水平上管理摄像机,这个变化会阻止我用Android 9做我今天能做的事情吗?

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

我们还能在没有暴露的物理摄像机上创建会话配置的捕获会话吗?

有人能解释一下吗?

共有2个答案

壤驷雅达
2023-03-14

这不是回溯。实际上,这是一个重要的步骤,可以更好地控制复杂的摄像机设置。

在API 29之前,如果制造商不能为构成复合摄像机的每个镜头提供单独的摄像机设备,他们就无法将镜头参数暴露给显影剂。他们唯一的选择是将合成相机整体曝光。

问题不是

我们还能在没有暴露的物理摄像机上创建会话配置的捕获会话吗?

而是,

现在我们可以读取以前无法曝光的物理摄像机的特征‼

有了新的更改,制造商可以向您提供关于“Back camera1”、“Back camera2”等的所有可用信息,即使无法对其启动单独的捕获会话。

getPhysicalCameraIds()参考解释:

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

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

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

端木权
2023-03-14

我尝试使用Pixel 5(Android 11)的第一个逻辑后置摄像头的物理ID打开摄像头,但失败了,错误:未知的摄像头ID......

因此,Pixel 5只返回2个逻辑摄像机ID,使用cameraManager只能打开这2个摄像机。打开摄像机(…) 方法。。。

三星S10(也是Android 11)返回4个逻辑摄像机ID,并且没有所有这些逻辑摄像机的任何物理摄像机ID,所有4个摄像机都可以毫无问题地使用。

像素5摄像机信息:

三星S10摄像头信息:

虽然对于Pixel 5,我没有尝试set物理相机(相机)https://developer.android.com/reference/android/hardware/camera2/params/OutputConfiguration.html#setPhysicalCameraId(java.lang.字符串)

我认为这种方法可以用来在不同的物理相机之间切换(例如我们可以打开广角相机)

更新

是的,我们可以使用像素4、5(我想还有更多的设备和制造商)的setPhysicalCameraId方法来设置特定的物理摄像机

接下来是逻辑:

>

  • 您可以使用相机管理器使用逻辑相机id打开相机

    然后,如果该逻辑相机支持多相机功能,那么它应该具有非空物理相机ID列表

    您可以从物理相机ID列表中选择任何id并将其设置为OutputConfiguration

    val outputs = surfaces.map {
        OutputConfiguration(it).apply {
            setPhysicalCameraId(cameraIdx)
        }
    }
    cameraDevice.createCaptureSessionByOutputConfigurations(
        outputs,
        stateCallback,
        backgroundCameraHandler
    )
    

    更新!警告!但它预览的是同一个视图,所以这种方法似乎不起作用(尽管也不例外),无论是否设置了物理相机,都没有任何变化

    似乎从Android 10开始就坏了-Android 10(api 29)相机2 api回归与广角相机

    更新

    我还尝试使用SessionConfiguration对象创建捕获会话,而不是使用不推荐的方法createCaptureSessionByOutputConfigurations

    val config = SessionConfiguration(
        SessionConfiguration.SESSION_REGULAR,
        outputs,
        backgroundCameraExecutor!!,
        stateCallback
    )
    cameraDevice.createCaptureSession(config)
    

    但仍然没有什么改变

  •  类似资料:
    • 上面的代码给出了列表中以X,Y,Z开头的元素的计数,但是在上面的例子中,我要在列表中迭代三次以获得数据的。这可以通过使用简单的for循环迭代列表一次来完成。有没有可能在单个流中完成所有这些条件[只迭代一次]而不是使用多个流? 非常感谢任何帮助。

    • 我真的不喜欢这样链接命令。有没有另一种方法在一个做?

    • 我有两张桌子 客户(ID,First_Name,Last_Name,地址); 订单(ID,Product_Name,价格,Order_Date日期,Customer_ID,金额); 我必须选择客户的姓氏以及他们的订单数量。 select请求的输出必须是

    • 问题内容: 一个非常简单的小问题,但是我不太明白该怎么做。 我需要将’_’的每个实例替换为空格,并将’#’的每个实例替换为空/空。 我已经试过了: 我真的不喜欢这样的链接命令。还有另一种方法可以做到这一点吗? 问题答案: 使用OR运算符(): 您还可以使用字符类: Fiddle 如果您想用一件事替换哈希值,而用另一件事替换下划线,则只需要链接即可。但是,您可以添加一个原型: 但是为什么不连锁呢?我

    • 我为欢迎屏幕设计了一个接口,其中有一个JFrame,包括两个JPanel(JPanel1在右边,JPanel2在左边)。左边的按钮用于切换JPanel1中的面板。我想按下一个按钮,用另一个JPanel替换JPanel1内容,但我不知道怎么做。请帮忙。

    • 我创建了以下主题、流和表: 为以上创建的主题创建表和流。 我可以看到以下数据: 我的问题: 现在我要将addressId 1(Fremont)替换为addressId 1(Detroit)。我怎么能那样做? 我还尝试打印输入到控制台的流,如票证中所述 是否将Kafka流输入打印到控制台? 只是,我可以看到下面的输出: 12:04:42.145[StreamThread-1]DEBUG org.ap