
CameraX是一個未捆綁的Android Jetpack庫,它可以幫助你在Android應用中輕松添加攝像頭功能。傳統上,由于Android設備種類繁多,編程模型復雜,在Android上構建具有相機功能的應用程序非常困難。
現在成千上萬的開發者都在使用CameraX,許多開發者已經實現了APK大小的縮小,業務指標的改善,同時也精簡了他們的資源,使他們的工程師能夠專注于構建很酷的新功能。
本篇講述了CameraX如何顛覆現有的相機框架編程模型,如何幫助你在Android上擴展你的應用,并介紹了自Beta版以來的新功能,比如輕松地將ML Kit等智能功能集成到你的應用中。

顛覆過去的復雜性
我們首先在網上搜索你們所遇到的各種問題,并在現場用一些現有的設備進行實驗。我們驚訝地了解到,你們中的許多人為了讓事情順利進行,在不同的制造商、芯片組、甚至是特定的設備上使用了大量的if-else代碼塊。造成這種行為的原因之一是,使用Camera1或Camera2框架API,你需要從一組特定設備和操作系統的輸入開始,以實現所需的輸出,例如拍攝一張照片。通過設計,這需要你提前知道設備配置,以幫助你實現目標-當新設備推出時,很難擴展你的代碼。

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

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

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

使用CameraX Extensions拍攝的三星S10+的HDR關閉(左)與HDR開啟(右)對比。
這些擴展功能適用于三星(從S10+開始的所有旗艦機)、摩托羅拉(他們的大部分設備都升級或推出了Android 10)、Oppo(Reno Pro 2)以及一些使用Unisoc移動處理器的入門級手機。
我們很高興能通過Extensions縮小差距,并感謝所有制造商不斷擴大具有這些功能的設備數量。
Getting to know CameraX Beta
目前在Play Store上有數千款應用部署了CameraX,涉及汽車、銀行、交友、聊天、電子商務、搜索、社交等多個類別。一些發現CameraX有幫助的開發者包括以下幾個。
- Monzo銀行使用CameraX a)消除了9000行代碼,包括UI代碼,b)將識別圖像捕捉和自拍視頻錄制的掉線率從25%降低到5%左右(案例研究)。
- YouCam Perfect通過CameraX實現了減少70%的代碼行數(比Camera2),它極大地提高了新產品開發的效率。
- Ufoto使用CameraX精簡了他們的資源,使他們的工程師能夠專注于開發很酷的新功能。他們還觀察到從Camera1遷移到CameraX時,有了明顯的改善。例如,在一些設備上,圖像捕捉速度提高了10%,在一些設備上,預覽幀率提高了30%。
下一步工作
我們將不斷提高Android系統的設備兼容性和可靠性,同時使CameraX更容易使用(開發者報告的已修復CameraX問題列表)。例如,在未來幾個月內,我們將在CameraX測試實驗室中增加更多的設備。我們堅信,開發者不應該擔心底層相機堆棧或設備的特殊性,這樣他們就可以專注于開發用戶喜歡的很棒的應用程序。
有超過2,000名開發者在生產中使用CameraX,我們建議你嘗試采用和部署CameraX Beta的最新版本。 如果你想親身體驗CameraX,請查看我們的教程和官方示例。在您試用CameraX之后,我們很樂意聽到您看到的改進類型。
如果你發現最新版本有任何問題,請盡可能在bugreports中提交一個bug(我們每周都會進行分流)。你也可以給Android CameraX討論組發郵件提出問題,或者在StackOverflow上用 "android-camerax "標簽發帖。
我們最衷心地感謝您,我們了不起的開發者、合作伙伴、制造商和CameraX團隊成員,感謝他們幫助我們塑造和構建CameraX Jetpack庫。