一. Camrea2接口技術
"Android 5.0 (API Level 21)重新设计Camera,并提供了一个全新的API——Camera2。Camera2基本上和Camera(1)没什么继承性,完全是重新设计。在Camera2中Google引入了Session/Request的概念,从使用上更加复杂,同时也支持更多特性,比如可以控制曝光、控制感光度、支持Raw格式输出。当然坑也更多。"
二. 學習資料
Android官方文檔參考 https://developer.android.com/reference/android/hardware/camera2/package-summary (部分图片来源于此)
易學教程 https://www.e-learn.cn/content/qita/775532 (借鉴了文档组织结构)
三. 概念明確
Camera Device(s)
實體相機設備,即物理攝像頭,有前置攝像頭,後置攝像頭等
Surface
输出图像被用于展示的地方
四. 重要類
android.hardware.camera2.CameraManager
用來查詢,獲取,打開Camera Device,可用過Activity的方法getSystemDevice(Context.CAMERA_SERVICE)來獲取其實例
android.hardware.camera2.CameraDevice
相機硬件實體對應的接口類,可通過CameraManger对象使用open方法获取此类的实例。此類的一組靜態屬性描述了一個CameraDevice的信息,可用的設置,還有一些相機輸出參數
android.hardware.camera2.
CameraCharacteristics
一個CameraDevice的具體信息。比如id號。通過此類可以設置CameraDevice的一些輸出參數(FPS,Image Size)。可以通過CameraManager的方法獲取其實例。此类通常与CameraDevice配合使用
android.hardware.camera2.CameraCaptureSession
建立相機會話的類。一個使用相機的常規步驟是通過CameraManager獲取到具體的CameraDevice,然後建立一個CameraCaptureSession。有了一個會話後便可向CameraDevice發送具體的請求(CameraCaptureSession)得到Image Stream(图像数据流)。此種設計模式類似與web訪問的技術。瀏覽器與服務器之間建立一個會話,然後瀏覽器發送請求就可以得到服務器的資源。面向鏈接的服務更穩定,獨立,容錯率更高。
android.view.Surface
略
android.hardware.camera2.CaptureRequest
获取图像的请求。可对传感器,镜头,闪光灯,防抖,对焦,曝光等进行配置。输出的图像被由Surface对象接收。此Surface对象被称为Target(目标)。要生成一个CameraRequest对象,使用CameraRequest.Builder类的静态方法build()来构造。而CameraRequest.Builder可由CameraDevice的createCaptureRequest方法来构造。需要注意的是,Surface对象由Builder对象管理,通过Builder的addTarget(Surface target)方法来添加。这样Builder生产出来的每个CameraRequest对象的输出地都是那个Surface对象。得到一CameraRequest对象后,就可以将其传给一个CameraCaptureSession会话了。具体操作是调用会话的setRepeatingRequest方法(请求连续的图像,通常用来做预览功能)或capture方法(请求一帧图像,通常用来做照相功能),具体参见API文档。
五. 简易抽象结构概览
六. 嵌套类的回调方法(Callback)
CameraDevice.StateCallback
使用CameraManager的openCamera方法需要传入一个此嵌套类的对象。
openCamera原型(重载方法未列出)
openCamera打开由cameraId指定的CameraDevice,然后根据打开的结果来回调callback中的函数。
CameraDevice.StateCallback的四个抽象方法
需要实现此静态抽象类并重写四个抽象方法,通过他们的方法名能轻易得知该方法在何时会被回调。可以按照自己的实现逻辑在不同的回调方法中编写代码
CameraCaptureSession.StateCallback
使用CameraDevice创建一个捕捉会话(createCaptureSession)需要传入一个此类的对象
createCaptureSession原型
该方法在CameraDevice中是抽象的,推测使用CameraManager的openCamera方法传回的CameraDevice是其子类,已重写此方法,有兴趣者可查看源代码一探究竟
CameraCaptureSession.StateCallback要求实现onConfigured方法与onConfigureFailed方法
可在onConfigured()中得到创建成功的CameraCapureSession实例,然后编写你的逻辑代码。比如在方法内部设置请求,立即开始拍照或预览等
CameraCaptureSession.CaptureCallback
这不是一个非得被传入的回调嵌套类。其回调方法皆未被申明为abstract。这意味着你可以创建一个匿名内部类但不用实现任何方法。该对象可以在CameraCaptureSession的setRepeatingRequest方法(其他可接受此类型对象的方法见下图)中被传入,你也可以用null代替。
七. 预览实例
略