CameraX是一個未捆綁的Android Jetpack庫,它可以幫助你在Android應(yīng)用中輕松添加攝像頭功能。傳統(tǒng)上,由于Android設(shè)備種類繁多,編程模型復(fù)雜,在Android上構(gòu)建具有相機功能的應(yīng)用程序非常困難?,F(xiàn)在成千上萬的開發(fā)者都在使用CameraX,許多開發(fā)者已經(jīng)實現(xiàn)了APK大小的縮小,業(yè)務(wù)指標的改善,同時也精簡了他們的資源,使他們的工程師能夠?qū)W⒂跇?gòu)建很酷的新功能。
這篇文章講述了CameraX如何顛覆現(xiàn)有的相機框架編程模型,如何幫助你在Android上擴展你的應(yīng)用,并介紹了自Beta版以來的新功能,比如輕松地將ML Kit等智能功能集成到你的應(yīng)用中。
顛覆過去的復(fù)雜性
我們首先在網(wǎng)上搜索你們所遇到的各種問題,并在現(xiàn)場用一些現(xiàn)有的設(shè)備進行實驗。我們驚訝地了解到,你們中的許多人為了讓事情順利進行,在不同的制造商、芯片組、甚至是特定的設(shè)備上使用了大量的if-else代碼塊。造成這種行為的原因之一是,使用Camera1或Camera2框架API,你需要從一組特定設(shè)備和操作系統(tǒng)的輸入開始,以實現(xiàn)所需的輸出,例如拍攝一張照片。通過設(shè)計,這需要你提前知道設(shè)備配置,以幫助你實現(xiàn)目標--當新設(shè)備推出時,很難擴展你的代碼。

Camera1/Camera2框架編程模型
我們不得不從根本上重新思考編程模型。你們的很多反饋啟發(fā)我們翻轉(zhuǎn)漏斗,從基于用例的方法開始(如下圖所示)。

CameraX編程模型
通過這種新的方法,團隊創(chuàng)建了一個非捆綁的庫,CameraX,它對所有主要的Android版本都是不可知的,并且可以在超過94%的設(shè)備上工作,從API 21開始,不需要特定設(shè)備的if-else塊。在CameraX中,你首先通過創(chuàng)建一個用例來指定你的目標,例如 "拍照 "與ImageCapture用例。然后CameraX確定操作系統(tǒng)和設(shè)備的具體配置,以幫助你實現(xiàn)你的目標。今天,用例是CameraX體驗的基礎(chǔ),從Preview、ImageAnalysis和ImageCapture開始。
幫助開發(fā)者擴大測試規(guī)模
除了現(xiàn)有的框架API實現(xiàn)和使用的復(fù)雜性之外,許多開發(fā)人員在跨大量Android設(shè)備和不同的相機配置的大規(guī)模測試他們的應(yīng)用程序時遇到了困難。我們了解到的是,即使是最基本的相機應(yīng)用,你的大量資源也花在了測試一個龐大的設(shè)備池上,導(dǎo)致了前面提到的特定設(shè)備的變通方法。鑒于測試是你整體開發(fā)的關(guān)鍵部分,這啟發(fā)我們建立一個專門的CameraX測試實驗室,以提供跨多個Android設(shè)備的測試覆蓋。

三星Galaxy J1 Ace在光控CameraX測試箱內(nèi)。
今天這個實驗室里有90多臺安卓設(shè)備。兩部手機被安裝在一個定制的測試箱內(nèi),箱內(nèi)有可控的燈光和一個電機,用來模擬相機應(yīng)用的旋轉(zhuǎn)和方向。這90多部設(shè)備代表了約4.5億部活躍的Android設(shè)備,涵蓋了所有的操作系統(tǒng)級別(從Marshmallow開始)、價格層級(我們最低端的手機零售價在100美元以下)、芯片組(涵蓋聯(lián)發(fā)科、高通和Unisoc)和制造商(完整的設(shè)備列表)。
縮小差距
在過去的幾年里,安卓制造商取得了巨大的進步,為移動設(shè)備帶來了高動態(tài)范圍(HDR)、模糊虛化和夜景攝影等新功能。然而,到目前為止,這種功能只能通過手機的本地(或系統(tǒng))相機應(yīng)用程序來實現(xiàn)。CameraX Vendor Extensions(又稱擴展功能)填補了這一空白,并向所有開發(fā)者開放了五種特定廠商的功能。這包括
HDR:使用制造商的多幀處理功能,合并多個幀,并提供保留場景高光和低光的圖像。
夜間:使用制造商的低光多幀處理功能,在低光條件下提供更有吸引力的圖片。
自動:根據(jù)當前的環(huán)境光照條件,自動確定并提供HDR或夜景圖像。
虛化:提供背景模糊的圖像,非常適合人物攝影。
美顏:在圖像中啟用面部美顏效果。
最棒的是:當啟用Extensions時,你不需要特定設(shè)備的if-else塊--只需編寫一次代碼,它就能在所有支持的設(shè)備上工作。您可以通過使用ExtensionsManager.ExtensionsAvailability來檢查是否在特定設(shè)備上啟用了Extensions。如果有擴展功能,您可以向用戶顯示必要的UI元素(如果適用),并將預(yù)覽和ImageCapture用例配置為使用擴展功能而不是正常的圖像捕獲。只需多寫幾行代碼,您就可以大幅提高圖像質(zhì)量和整體用戶體驗。

使用CameraX Extensions拍攝的三星S10+的HDR關(guān)閉(左)與HDR開啟(右)對比。
這些擴展功能適用于三星(從S10+開始的所有旗艦機)、摩托羅拉(他們的大部分設(shè)備都升級或推出了Android 10)、Oppo(Reno Pro 2)以及一些使用Unisoc移動處理器的入門級手機。我們很高興能通過Extensions縮小差距,并感謝所有制造商不斷擴大具有這些功能的設(shè)備數(shù)量。
啟用新功能
從CameraX在Google I/O 2019年的Alpha發(fā)布,2020年2月的Beta版,快進到今天。通過最新的Beta版本,我們很高興與大家分享關(guān)于CameraX的改進兼容性,引入PreviewView以獲得無縫預(yù)覽,以及新的樣本和實用程序,使CameraX的使用更加簡單。首先是設(shè)備兼容性的提升,我們通過在CameraX中添加修復(fù)和解決方法,解決了一些特定設(shè)備的問題,如設(shè)備長寬比錯誤(LG G3),在某些情況下無法切換相機(Pixel 2),以及解決點擊對焦(三星J7)。此外,根據(jù)您從公眾錯誤報告中獲得的意見(謝謝您?。覀冊贑ameraX測試實驗室中增加了額外的測試,如UI小部件集成和長寬比測試。如果你看到任何設(shè)備上的特定問題,請告訴我們,我們將很樂意解決這些問題。
雖然CameraX確實提供了Preview用例,但許多人一直在詢問一個更簡單的解決方案來獲得屏幕上的預(yù)覽。PreviewView是在您的應(yīng)用程序中添加與相機交互的視圖的最簡單方法。它不需要深入了解相機API或底層硬件的知識,而且由于它由CameraX提供支持,所以它很省電,并為用戶提供非常低的延遲。它通過默認使用SurfaceView來實現(xiàn),如果設(shè)備與SurfaceView不兼容,它會自動回退到TextureView。
PreviewView也有助于改善用戶體驗。新的getPreviewStreamState()API使你的應(yīng)用程序能夠在預(yù)覽是流媒體或空閑時得到通知。您可以使用這個新的API在預(yù)覽閑置時在PreviewView的頂部顯示一個占位符圖像,并在預(yù)覽是流媒體時隱藏占位符。這避免了在預(yù)覽啟動時出現(xiàn)令人不快的黑屏。你可以在這篇博文中了解更多關(guān)于如何使用PreviewView的信息。
最后,ImageAnalysis從提供每幀緩沖區(qū)訪問開始。一旦我們將這一用例與ML Kit的交鑰匙API結(jié)合起來,就會打開很多新的可能性,比如文本識別、圖像標簽,甚至使用你自己訓(xùn)練的Tensorflow Lite模型檢測和識別對象。另外,你也可以直接使用CameraX與TensorFlow Lite運行時(GitHub)。要深入了解CameraX的最新更新,請查看這段視頻:
目前在Play Store上有數(shù)千款應(yīng)用部署了CameraX,涉及汽車、銀行、交友、聊天、電子商務(wù)、搜索、社交等多個類別。一些發(fā)現(xiàn)CameraX有幫助的開發(fā)者包括以下幾個。
Monzo銀行使用CameraX a)消除了9000行代碼,包括UI代碼,b)將識別圖像捕捉和自拍視頻錄制的掉線率從25%降低到5%左右(案例研究)。
YouCam Perfect通過CameraX實現(xiàn)了減少70%的代碼行數(shù)(比Camera2),它極大地提高了新產(chǎn)品開發(fā)的效率。
Ufoto使用CameraX精簡了他們的資源,使他們的工程師能夠?qū)W⒂陂_發(fā)很酷的新功能。他們還觀察到從Camera1遷移到CameraX時,有了明顯的改善。例如,在一些設(shè)備上,圖像捕捉速度提高了10%,在一些設(shè)備上,預(yù)覽幀率提高了30%。
下一步工作
我們將不斷提高Android系統(tǒng)的設(shè)備兼容性和可靠性,同時使CameraX更容易使用(開發(fā)者報告的已修復(fù)CameraX問題列表)。例如,在未來幾個月內(nèi),我們將在CameraX測試實驗室中增加更多的設(shè)備。我們堅信,開發(fā)者不應(yīng)該擔心底層相機堆棧或設(shè)備的特殊性,這樣他們就可以專注于開發(fā)用戶喜歡的很棒的應(yīng)用程序。有超過2,000名開發(fā)者在生產(chǎn)中使用CameraX,我們建議你嘗試采用和部署CameraX Beta的最新版本。如果你想親身體驗CameraX,請查看我們的教程和官方示例。在您試用CameraX之后,我們很樂意聽到您看到的改進類型。如果你發(fā)現(xiàn)最新版本有任何問題,請盡可能在bugreports中提交一個bug(我們每周都會進行分流)。你也可以給Android CameraX討論組發(fā)郵件提出問題,或者在StackOverflow上用 "android-camerax "標簽發(fā)帖。
我們最衷心地感謝您,我們了不起的開發(fā)者、合作伙伴、制造商和CameraX團隊成員,感謝他們幫助我們塑造和構(gòu)建CameraX Jetpack庫。
一點題外話:
我們有《Android學(xué)習、面試;文檔、視頻資源免費獲取》,可復(fù)制鏈接后用石墨文檔 App 或小程序打開鏈接或者私信我資料領(lǐng)取。
https://shimo.im/docs/TG8PDh9D96WGTT8W