由于最近同学一直在做这个人脸识别方面的集成,正好一起研究一下。查了些资料,整合一下。
写了几小时,撤回ctrl+z一下,结果恢复了挺早的版本了,更致命的是页面下面弹窗已保存为草稿,2小时写的东西都没了,那么从简。
Camera2是用来替代Camera类的
API Level21及以上可以用是,也就是安卓5.0版本及以上。
Platform Version | API Level | VERSION_CODE |
---|
Android 5.0 | 21 | LOLLIPOP |
camera2并不是所有手机都完整支持的。需要硬件层面的支持,硬件支持等级低,camera2的一些高级功能无法使用。不细说,
简介
Camera2使用流程为:
1.检查相机权限
检查获取权限(之前特地写了一下)
2.获取相机服务
//创建CameraManager实例
CameraManager cameraManager = (CameraManager)getSystemService(Context.CAMERA_SERVICE);
3.获取相机硬件ID集合
String camerId = cameraManager.getCameraIdList()[0];
//返回相机列表
获取ID后可通过该ID得知该设备的可用设置和输出参数。这些信息是通过CameraCharateristics对象提供的 ,可通过getCameraCharacteristics(String)
CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(camerId);
根据摄像头的ID去查该摄像头的参数,设置最大输出尺寸等。
CameraCharacteristics 详解
4.开启相机
cameraManager.openCamera(camerId, stateCallback, null);
5.CameraDevice.StateCallback回调中获取cameraDevice(上面的stateCallback)
private CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback(){
@Override
public void onOpened(@NonNull CameraDevice camera) {
cameraDevice = camera;
//获取摄像头
startPreview();
//开启预览
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) {
}
@Override
public void onError(@NonNull CameraDevice camera, int error) {
}
};
6.浏览函数(这段清掉了不想重写了,直接整合压在一起)
创建捕捉会话,surface输出捕获的图像数据
cameraDevice.createCaptureSession(surfaces,new CameraCaptureSession.StateCallback(),null)
创建捕获会话,surfaces作为捕获的图像数据的输出的目标,surfaces必须预先设置好参数(根据摄像头的参数)。
surfaces可以是SurfaceView或
SurfaceTexture,再
通过 Surface(SurfaceTexture)
, MediaCodec
,MediaRecorder
, Allocation
,和ImageReader(图片、视频等处理个人理解可能不对)。
CameraCaptureSession.StateCallback回调中获取到CameraCaptureSession
CaptureRequest.Builder 创建请求,通过键值对的方式设置参数
cameraCaptureSession.setRepeatingRequest(previewRequest,
captureCallback, null); 发送请求
//设置默认缓冲区的尺寸和相机所支持的最大尺寸
texture.setDefaultBufferSize(previewSize.getWidth(), preview.getHeight());
//开启预览所需要的输出Surface
Surface surface = new Surface(texture);
try {
//创建预览请求
requestbuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
requestbuilder.addTarget(surface);
//创建预览会话
cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
//获取预览会话
captureSession = session;
//配置预览界面使用3A模式(自动曝光、自动对焦、自动白平衡)
requestbuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
//创建用于预览界面的线程
previewThread = new HandlerThread("preview");
previewThread.start();
previewhandler = new Handler(previewThread.getLooper());
try {
//设置重复捕获图像
captureSession.setRepeatingRequest(requestbuilder.build(), null, previewhandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
//略
}catch (CameraAccessException e){
e.printStackTrace();
}
}
再xml文件中放一个textureview。
imageReader = ImageReader.newInstance(1920,1080,ImageFormat.JPEG,2);
//构造一个ImageReader的实例,设置宽高,输出格式,缓存最大数量
//请确定给的参数不为空,不然直接给参数
imageReader.setOnImageAvailableListener(onImageAvailableListener,previewhandler);
private ImageReader.OnImageAvailableListener onImageAvailableListener = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = reader.acquireLatestImage();
//略
image.close();
}
};
//
requestbuilder.addTarget(imageReader.getSurface());
cameraDevice.createCaptureSession(Arrays.asList(previewSurface,imageReader.getSurface()), new CameraCaptureSession.StateCallback() {//略
},, previewhandler);
流程
官网(翻)
参考