許多現(xiàn)代 Android 手機(jī)的正面和/或背面都有多個(gè)攝像頭。有些相機(jī)協(xié)同工作可以讓您的照片看起來更好,例如借助單色相機(jī)捕獲更多光線,或者利用深度相機(jī)的附加信息來利用散景效果等功能。其他相機(jī)獨(dú)立工作,每個(gè)相機(jī)都提供不同的功能來擴(kuò)展您的拍照能力。您可以選擇廣角相機(jī)來拍攝超廣角自拍照,也可以使用長(zhǎng)焦相機(jī)放大細(xì)節(jié),而無需對(duì)設(shè)備進(jìn)行任何物理更改。
然而,有一個(gè)問題。這些攝像機(jī)應(yīng)面向同一方向,即正面或背面。同時(shí)使用前置和后置攝像頭怎么樣?就像下面這樣

這并不是個(gè)容易的工作
多相機(jī)API
了解多攝像頭 API至關(guān)重要,該 API 是隨 Android 9(API 級(jí)別 28)引入的。盡管這聽起來像是我們需要的,但事實(shí)并非如此。多攝像頭 API 允許通過抽象(軟件)邏輯攝像頭同時(shí)操作更多物理攝像頭,但這些攝像頭必須指向同一方向。
邏輯相機(jī)的輸出取決于其實(shí)現(xiàn)。它可能是來自其中一臺(tái)物理攝像機(jī)的流,也可能是來自多個(gè)物理攝像機(jī)的融合流。無論哪種方式,都只有一個(gè)活動(dòng)的攝像機(jī)會(huì)話。
并發(fā)相機(jī)流
盡管當(dāng)前的 Camera2 指南中未提及,但從 Android 11(API 級(jí)別 30)開始,Camera2 API 包含用于查明設(shè)備是否支持更多攝像頭并發(fā)流傳輸?shù)姆椒?,包?/a>在前置攝像頭和后置攝像頭上進(jìn)行操作的可能性同一時(shí)間。
還可以PackageManager使用FEATURE_CAMERA_CONCURRENT功能名稱來檢查其是否存在,API 級(jí)別低于 30 的設(shè)備可以公布該功能名稱。
與多攝像頭 API 相比,主要區(qū)別在于并發(fā)攝像頭作為獨(dú)立實(shí)體運(yùn)行 - 每個(gè)攝像頭都有自己的攝像頭會(huì)話。
為了允許應(yīng)用程序開發(fā)人員查詢?cè)O(shè)備,制造商必須實(shí)現(xiàn)相機(jī)硬件抽象層 (HAL)中定義的適當(dāng)方法。
相機(jī)硬件抽象層 (HAL) 定義了將更高級(jí)別的相機(jī)框架 API 與相機(jī)驅(qū)動(dòng)程序和硬件連接起來的標(biāo)準(zhǔn)化接口。每個(gè)相機(jī)供應(yīng)商都必須實(shí)現(xiàn) HAL,以便應(yīng)用程序可以正確地使用相機(jī)硬件進(jìn)行操作。有關(guān)更多信息,請(qǐng)查看文檔。
例如,三星 Galaxy S22 系列的相機(jī)應(yīng)用程序中帶有導(dǎo)演視圖,允許使用與 API 返回的組合集相對(duì)應(yīng)的成對(duì)相機(jī)。Google Pixel 6 的行為方式相同,盡管它在相機(jī)應(yīng)用程序中沒有類似的模式。
另一方面,對(duì)于某些具有適當(dāng)相機(jī)模式的設(shè)備(例如三星 Galaxy Z Flip 或小米 Poco X3),雖然允許以編程方式同時(shí)運(yùn)行前置攝像頭和后置攝像頭,但該功能FEATURE_CAMERA_CONCURRENT不可用,并且返回的組合集為空。這是否意味著第三方應(yīng)用程序不應(yīng)依賴該功能???♀?
除此之外,當(dāng)我嘗試打開前置攝像頭和后置攝像頭時(shí),我嘗試過的大多數(shù)設(shè)備都會(huì)調(diào)用onError帶有錯(cuò)誤代碼的回調(diào)ERROR_MAX_CAMERAS_IN_USE,并且它們聲明的并發(fā)攝像頭集為空。
總結(jié)
目前大多數(shù)非高通基帶的手機(jī), 所有低于android11的手機(jī), 所有的華為鴻蒙操作系統(tǒng)手機(jī)都無法在應(yīng)用層面支持前后攝像頭的同時(shí)開啟.
至于在可用的手機(jī)上如何同時(shí)開啟前后攝像頭, 也需要很微妙的操作.
上傳了一份demo: MutiCamera 可以在絕大多數(shù)新手機(jī)上實(shí)現(xiàn)此功能.