Camera2是现在Andoird相机开发中经常使用的框架,最近一直在学习Camera2的使用,今天简单分享一下我学到的Camera2的预览拍照的流程。
1、获取相机服务,在Camera2中相机服务的管理使用CameraManager对象来进行,所以第一步是获取相机服务。
CameraManager mCameraManager = (CameraManager)getSystemService(Context.CAMERA_SERVICE);
2、获取相应的CameraDevice,想要具体的使用某个摄像头进行工作,获取相机服务之后需要获取相应的摄像头设备(即CameraDevice)。
//获取相应的CameraId列表
String[] mCameraIdList = mCameraManager.getCameraIdList();
//从CameraIdList中选择你需要的摄像头Id
//CameraId:选用的摄像头Id, CameraDevice.StateCallback:CameraDevice的状态回调,监听CameraDevice是否打开之类的状态, handler:绑定的handler
mCameraManager.openCamera(CameraId,CameraDevice.StateCallback,handler);
//在CameraDevice.StateCallback中选择CameraDevice
CameraDevice.StateCallback(){
public void opened(CameraDevice cameradevice){
mCameraDevice = caneradevice;
}
}
3、创建CaptureRequest.Build对象,CaptureRequest.Build对象主要是用来添加请求的对象以及供之后的CaptureSession进行动作的。
//这里以预览为例,使用预览模板
CaptureRequest.Buildr mCaptureRequest = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
//添加对象
mCaptureRequest.addTarget(previewSurface);
4、创建会话CaptureSession,CaptureSession主要用于完成Capture的请求(比如预览,拍照)。
mCameraDevice.createCaptureSession(List<Surface>,new CaptureSession.StateCallback{
public void onConfiged(CaptureSessoin capturesession){
mCaptureSession = capturesession;
//设置一些AF,AE之类的参数
mCapturesession.setReaptingRequest(mCapturerequest.build(),listener,handler);
}
}
到这里的话相机就已经可以开始预览了。
5、拍照,拍照经常是在预览的时候通过点击事件进行监听发送Capture请求进行拍照。
CaptureRequest.Builder takePictureCaptureRequest = mCameraDevice.CreateCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
takePictureCaptureRequest.addTarget(mImageReader.gteSurface);
//设置拍照AE,AF,拍照方向之类的
mCaptureSession.capture(takePictureCaptureRequest.build(),new CameraCaptureSesion.CaptureCallback(){
public void onCaptureCompleted(session,request,result){
startPreview();
}
},handler);
也有博主说mCaptureSession.capture()之前需要先停止预览,其实不需要,因为Camera2中拍照的优先级是高于预览的,所以不用手动停止,所以onCaptureCompleted()里面的startPreview()也可以不用。
6、使用ImageReader.OnImageAvailableListener()监听,从ImageReader中取出图片保存。
//在ImageReader初始化之后对ImageRder添加监听
mImageReader.setOnImageAvailableListener(mImageReaderListener,handler);
ImageReader.OnImageAvailableListener mImageReaderListener = new ImageReader.OnImageReaderAvailable(){
public void onImageAvailable(ImageReader imageReader){
Image iamge = imageReader.acquireNextImage();
//保存图片
//保存玩图片之后一定要记得释放资源
image.close();
}
}
基于Camera2的预览拍照流程简单的就是这样,希望对大家能有所帮助,同时有错误希望大家指出,谢谢。