安卓Camera2笔记

由于最近同学一直在做这个人脸识别方面的集成,正好一起研究一下。查了些资料,整合一下。

写了几小时,撤回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), MediaCodecMediaRecorder, 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 = 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);

流程

官网(翻)

参考

你可能感兴趣的:(安卓,笔记)