譯 Android 的多攝像頭支援

2021-09-11 09:35:29 字數 2953 閱讀 6475

譯文出自:掘金翻譯計畫

譯者:luoqiuyu

校對者:hanliuxin5

從 android p 開始,新增了對邏輯多攝像頭和 usb 攝像頭的支援。這對 android 開發者來說意味著什麼?

一台裝置有多個攝像頭沒什麼新鮮的,但是直到現在,android 裝置仍然最多只有前後兩個攝像頭。如果你想要開啟第乙個攝像頭,需要進行以下操作:

val cameradevice = camera.open(0)

複製**

但是這些是比較簡單的操作。如今多攝像頭意味著前置或者後置有兩個及兩個以上的攝像頭。有很多鏡頭可供選擇!

由於相容性問題,儘管舊的 camera api 已經被廢棄很長時間,上述的**仍然有效。但是隨著生態系統的發展,需要更先進的相機功能。因此,android 5.0(lollipop)引進了 camera2,適用於 api 21 及以上。用 camera2 api 來開啟第乙個存在的攝像頭**如下所示:

val cameramanager = activity.getsystemservice(context.camera_service) as cameramanager

val cameraid = cameramanager.cameraidlist[0]

cameramanager.opencamera(cameraid, object : cameradevice.statecallback

() override fun ondisconnected(device: cameradevice)

override fun onerror(device: cameradevice, error: int)

}, null)

複製**

上述**目前看起來沒什麼問題。如果我們所需要的只是乙個能夠開啟第乙個存在的攝像頭的應用程式,那麼它在大部分的 android 手機上都有效。但是考慮到以下場景:

那麼我們應該怎麼做?檢查攝像頭列表和攝像頭特性:

val cameraidlist = cameramanager.cameraidlist // may be empty

val characteristics = cameramanager.getcameracharacteristics(cameraid)

val cameralensfacing = characteristics.get(cameracharacteristics.lens_facing)

複製**

變數cameralensfacing有以下取值:

更多有關攝像頭配置的資訊,請檢視文件.

根據應用程式的使用情況,我們希望預設開啟特定的相機鏡頭配置(如果可以提供這樣的功能)。比如,**應用程式很可能想要開啟前置攝像頭,而一款增強現實類的應用程式應該希望開啟後置攝像頭。我們可以將這樣的乙個邏輯包裝成乙個函式,它可以正確地處理上面提到的情況:

fun getfirstcameraidfacing(cameramanager: cameramanager,

facing: int = camerametadata.lens_facing_back): string?

}// if no camera matched desired orientation, return the first one from the list

return cameraids.firstornull()

}複製**

目前為止,我們討論了如何基於應用程式的用途選擇預設攝像頭。很多相機應用程式還為使用者提供切換攝像頭的功能:

google 相機應用中切換攝像頭按鈕

要實現這個功能,嘗試從cameramanager.getcameraidlist()提供的列表中選擇下乙個攝像頭,但是這並不是個好的方式。因為從 android p 開始,我們將會看到在同樣的情況下更多的裝置有多個攝像頭,甚至有通過 usb 連線的外部攝像頭。如果我們想要提供給使用者切換不同攝像頭的 ui,建議(按照文件)是為每個可能的鏡頭配置選擇第乙個可用的攝像頭。

fun filtercameraidsfacing(cameraids: array, cameramanager: cameramanager,

facing: int): list

}fun getnextcameraid(cameramanager: cameramanager, currcameraid: string? = null): string? else

}複製**

這看起來可能有點複雜,但是我們需要考慮到大量的有不同配置的裝置。

對於那些仍然在使用已經廢棄的 camera api 的應用程式,通過 camera.getnumberofcameras() 得到的攝像頭的數量取決於 oem 的實現。文件上是這樣描述的:

如果系統中有邏輯多攝像頭,為了保持應用程式的向後相容性,這個方法僅為每個邏輯攝像頭和底層的物理攝像頭組公開乙個攝像頭。使用 camera2 api 去檢視所有攝像頭。

請仔細閱讀 其餘文件 獲得更多資訊。通常來說,類似的建議適用於:使用 camera.getcamerainfo() api 查詢所有的攝像頭方向, 在使用者切換攝像頭時,僅僅只為每個可用的方向提供乙個攝像頭。

android 執行在許多不同的裝置上。你不應該假設你的應用程式總是在有一兩個攝像頭的傳統的手持裝置上執行,而是應該為你的應用程式選擇最適合的攝像頭。如果你不需要特定的攝像頭,選擇有所需預設配置的第乙個攝像頭。如果裝置連線了外部攝像頭,則可以合理的假設使用者希望首先看到這些外部攝像頭中的第乙個。

如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計畫 對譯文進行修改並 pr,也可獲得相應獎勵積分。文章開頭的本文永久鏈結即為本文在 github 上的 markdown 鏈結。

Android適配多攝像頭

從 android p 開始,android將新增對邏輯多攝像頭和 usb 攝像頭的支援。這意味著,除了前後兩個攝像頭外,android手機的前置或者後置有兩個及兩個以上的攝像頭。對此,對於android開發者來說,就需要完成這方面的適配工作。多攝像頭 一台裝置有多個攝像頭沒什麼新鮮的,但是直到現在...

Android 呼叫攝像頭

androidmanifest新增許可權 intent呼叫開啟照相機 intent intent new intent mediastore.action image capture file file new file environment.getexternalstoragedirectory...

Linux (多攝像頭)如何執行指定的攝像頭

lz原來一直都是用的筆記本的攝像頭,結果標定的時候快趴地上了,可能是實在看不過去了,師兄給了乙個攝像頭,這樣相當於有兩個攝像頭,但是怎麼開啟指定的攝像頭呢?第乙個,安裝乙個軟體 sudo apt get install cheese安裝好了?哈哈,然後直接執行在終端中輸入 cheese就直接開啟筆記...