Android拍照录像框架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的运行逻辑,就不进行进阶介绍了。将以上流程走通之后,只需要配合文档进一步设置就能实现高阶效果。