许多现代 Android 手机的正面和/或背面都有多个摄像头。有些相机协同工作可以让您的照片看起来更好,例如借助单色相机捕获更多光线,或者利用深度相机的附加信息来利用散景效果等功能。其他相机独立工作,每个相机都提供不同的功能来扩展您的拍照能力。您可以选择广角相机来拍摄超广角自拍照,也可以使用长焦相机放大细节,而无需对设备进行任何物理更改。
然而,有一个问题。这些摄像机应面向同一方向,即正面或背面。同时使用前置和后置摄像头怎么样?就像下面这样
这并不是个容易的工作
多相机API
了解多摄像头 API至关重要,该 API 是随 Android 9(API 级别 28)引入的。尽管这听起来像是我们需要的,但事实并非如此。多摄像头 API 允许通过抽象(软件)逻辑摄像头同时操作更多物理摄像头,但这些摄像头必须指向同一方向。
逻辑相机的输出取决于其实现。它可能是来自其中一台物理摄像机的流,也可能是来自多个物理摄像机的融合流。无论哪种方式,都只有一个活动的摄像机会话。
并发相机流
尽管当前的 Camera2 指南中未提及,但从 Android 11(API 级别 30)开始,Camera2 API 包含用于查明设备是否支持更多摄像头并发流传输的方法,包括在前置摄像头和后置摄像头上进行操作的可能性同一时间。
还可以PackageManager使用FEATURE_CAMERA_CONCURRENT功能名称来检查其是否存在,API 级别低于 30 的设备可以公布该功能名称。
与多摄像头 API 相比,主要区别在于并发摄像头作为独立实体运行 - 每个摄像头都有自己的摄像头会话。
为了允许应用程序开发人员查询设备,制造商必须实现相机硬件抽象层 (HAL)中定义的适当方法。
相机硬件抽象层 (HAL) 定义了将更高级别的相机框架 API 与相机驱动程序和硬件连接起来的标准化接口。每个相机供应商都必须实现 HAL,以便应用程序可以正确地使用相机硬件进行操作。有关更多信息,请查看文档。
例如,三星 Galaxy S22 系列的相机应用程序中带有导演视图,允许使用与 API 返回的组合集相对应的成对相机。Google Pixel 6 的行为方式相同,尽管它在相机应用程序中没有类似的模式。
另一方面,对于某些具有适当相机模式的设备(例如三星 Galaxy Z Flip 或小米 Poco X3),虽然允许以编程方式同时运行前置摄像头和后置摄像头,但该功能FEATURE_CAMERA_CONCURRENT不可用,并且返回的组合集为空。这是否意味着第三方应用程序不应依赖该功能?🤷♀️
除此之外,当我尝试打开前置摄像头和后置摄像头时,我尝试过的大多数设备都会调用onError带有错误代码的回调ERROR_MAX_CAMERAS_IN_USE,并且它们声明的并发摄像头集为空。
总结
目前大多数非高通基带的手机, 所有低于android11的手机, 所有的华为鸿蒙操作系统手机都无法在应用层面支持前后摄像头的同时开启.
至于在可用的手机上如何同时开启前后摄像头, 也需要很微妙的操作.
上传了一份demo: MutiCamera 可以在绝大多数新手机上实现此功能.