轉載自 Coder包子哥 的博客 Android使用Camera2 替代過時的Camera API
因爲考慮到想要新增新的5.0以上的Camera2 API,發現變得太多,有重構的意思,還好先發現了這篇文章,目前對5.0以下的版本都沒有兼容包和支持,所以建議按照文中最後一條做一下API版本判斷
以下文章出自:
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0428/2811.html#badfb4523
概要
從5.0開始(API Level 21),可以完全控制安卓設備相機的新api Camera2(android.hardware.Camera2)被引入了進來。在以前的Camera api(android.hardware.Camera)中,對相機的手動控制需要更改系統才能實現,而且api也不友好。不過老的Camera API在5.0上已經過時,在未來的app開發中推薦的是Camera2 API。
L版本之前的Camera API
- 有限的圖片數據流獲取方式
- 有限相機狀態信息
- 沒有手動捕獲控制
Camera2 API
Supports 30fps full resolution with burst mode
支持30fps的全高清連拍
Supports change on manual camera settings between frame capture
支持幀之間的手動設置
Supports RAW image capture
支持RAW格式的圖片拍攝
Supports Zero Shutter Lag & Movie Snapshot
支持快門0延遲以及電影速拍
Supports setting other manual camera device controls including level of Noise Cancelling
支持相機其他方面的手動控制包括噪音消除的級別
相機的基本使用被分成了5個主要部分
- CameraManager
- CameraDevice
- CameraCaptureSession
- CaptureRequest
- CaptureResult
CameraManager:
提供構建,列出以及鏈接相機設備的接口
http://developer.android.com/reference/android/hardware/camera2/CameraManager.html
CameraDevice:
代表和安卓設備相連的單個相機
http://developer.android.com/reference/android/hardware/camera2/CameraDevice.html
CameraCaptureSession:
提供一套輸出目標的
surface(TextureView,MediaRecorder,MediaCodec,ImageReader,RenderScriptAllocation)。
http://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.html
CaptureRequest:
- Settings and outputs needed to capture a single image from the camera device
- Create request builder by predefined templates(TEMPLATE_PREVIEW, TEMPLATE_RECORD, TEMPLATE_STILL_CAPTURE, TEMPLATE_VIDEO_SNAPSHOT, TEMPLATE_MANUAL)
- This requests are given to capture or setRepeatingRequest to capture images from the camera
- http://developer.android.com/reference/android/hardware/camera2/CaptureRequest.html
CaptureResult:
從圖像傳感器獲得的單個圖片拍攝的結果。
http://developer.android.com/reference/android/hardware/camera2/CaptureResult.html
更詳細的內容,需要通讀Camera2包的概要介紹頁
http://developer.android.com/reference/android/hardware/camera2/package-summary.html
還有一個YouTube上的谷歌開發者的介紹視頻,解釋了Camera2 API的改動:DevBytes:Android L開發者預覽之- Camera2 API
https://www.youtube.com/watch?v=Xtp3tH27OFs
你需要記住在安卓設備上,Camera2 API的所有特性並不都總是可用的。取決於設備本身。爲了檢查那些特性可用,可以使用CameraCharacteristics來獲得支持信心。
characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
返回的結果分爲級別的相機功能,按照 全支持> 有限支持> 看心情贈送的順序排列:
INFO_SUPPORTED_HARDWARE_LEVEL_FULL
全方位的硬件支持,允許手動控制全高清的攝像。如果返回的是這個,連拍模式以及其他新特性都是可用的。https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#INFO_SUPPORTED_HARDWARE_LEVEL
INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED
一個“有限支持”的設備可能有一些或者沒有“全支持”設備的特性。有些特性可能不屬於任何硬件級別,需要單獨查詢。
INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY
所有的設備都會有的特性。這和過時的Camera API所支持的特新是一樣的。
雖然推薦在未來的app中使用Camera2 API,但是隻有Lollipop的設備商纔可用,也不大可能會出現兼容老設備的包。因此在最小版本(minSdkVersion)升到21之前,你還是需要繼續使用Camera API(android.hardware.Camera)。
不過你可以用下面的代碼對不同的版本區別對待:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
// your code using Camera API here - is between 1-20
} else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// your code using Camera2 API here - is api 21 or higher
}
- 1
- 2
- 3
- 4
- 5
最後,在網上發現幾個使用Camera API2開發的實例程序,總結一下方便後續參考:
Camera2 Basic : https://github.com/googlesamples/android-Camera2Basic
演示如何使用Camera2 API基本功能的demo。你可以從中學會如何遍歷相機設備的所有特性,顯示預覽照片,以及拍照。Camera2 Video:https://github.com/googlesamples/android-Camera2Video
這個demo演示如何使用Camera2 API錄製視頻。Camera2 master: http://www.eyesourcecode.com/thread-35378-1-1.html
使用Android L Camera2 API開發的示例應用程序,具備拍照,AWB,Flash,連拍功能LCamera http://www.eyesourcecode.com/thread-35377-1-1.html
L Camera是一個開源的實驗性質的Camera應用程序,基於Android L提供的新API android.hardware.camera2,目前只支持在Andorid 5.0 Lollipop版本的Nexus 5和Nexus 6上運行。