Camera2框架使用簡介
在Android 21時Google更新了以往的攝像頭類庫Camera,取而代之的是Camera2。作爲更新版本,Camera2具有更強功能的同時也增加了我們使用的困難性。
核心類
- CameraManager:作爲整個框架的入口,用於初始化其他類,本身意義不大,使用也很簡單。
- CameraCharacteristics:通過CameraManager獲得,可提供Camera相關參數,例如:設備支持的分辨率等。
- CameraDevice:通過CameraManager獲得,類似之前的Camera類,可以進行預覽等操作,例如:設置顯示預覽的Surface。
- CaptureRequest.Builder:通過CameraDevice獲得,可以設置預覽的相關配置。
- CameraCaptureSession:通過CameraDevice獲得,控制通過CaptureRequest.Builder進行預覽。
預覽調用流程
CameraManager -> CameraDevice -> CaptureRequest.Builder -> CameraCaptureSession。
代碼
初始化CameraManager:
val cameraManager = context.getSystemService(Service.CAMERA_SERVICE) as CameraManager
獲得CameraDevice:
cameraManager.openCamera(cameraManager.cameraIdList[0], object : CameraDevice.StateCallback() {
override fun onOpened(camera: CameraDevice) {
}
override fun onDisconnected(camera: CameraDevice?) {
}
override fun onError(camera: CameraDevice?, error: Int) {
}
}, null)
獲得CaptureRequest.Builder,配置預覽Surface:
val captureBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)
captureBuilder.addTarget(surface)
獲得CameraCaptureSession,開始預覽:
camera.createCaptureSession(surfaceList, object : CameraCaptureSession.StateCallback() {
override fun onConfigureFailed(session: CameraCaptureSession) {
log("相機預覽出錯: onConfigured")
}
override fun onConfigured(session: CameraCaptureSession) {
log("onCameraSessionConfigure")
try {
mPreviewBuilder.set(CaptureRequest.JPEG_ORIENTATION, 90)
mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, backgroundHandler)
} catch (e: CameraAccessException) {
e.printStackTrace()
}
}
}, backgroundHandler)
寫在最後
本文只介紹了Camera2的基礎預覽使用流程,爲了讓剛接觸的朋友可以更爲清晰的理解Camera2的運行邏輯,就不進行進階介紹了。將以上流程走通之後,只需要配合文檔進一步設置就能實現高階效果。