基于Camera2的预览功能(附源码)

基于Camera2的预览功能

Camera2简介

Camera2讲解

源码

Camera2简介

  1. google在API 21种新增了camera2,区别于camera1,camera2将摄像头设备建模为管道,该管道接收输入请求以捕获单个帧,每个请求捕获单个图像,然后输出一个捕获结果元数据包以及该请求的一组输出图像缓冲区。
  • CameraManager:所有相机设备(CameraDevice)的管理者,用来获取摄像头列表,初始化摄像头列表时制定打开默认摄像头等功能。
  • CameraDevice:摄像头设备,用于描述了硬件设备的可用设置和输出参数,通常是CameraCharacteristics对象提供,通过getCameraCharacteristics方法获取,用于创建CameraCaptureSession和CaptureRequest。
  • CameraCaptureSession:相机捕获会话,用于处理拍照和预览。
  • CaptureRequest:捕获请求,定义输出缓冲区以及输出到界面(SurfaceTexture或者TextureView)。

Camera2讲解

  1. camera2的工作可以简单分为以下几步:
    1. 获取相关的权限,在AndroidManifest中申明:(此处由于)
     <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
    1. 在Android6.0以上,因为Google将camera等权限设置为危险权限,所以还需要动态获取相应的权限。
    2. 在xml中写出相应布局文件,此处用了TextureView,接着开启线程,判断TextureView是否已经准备就绪,回调SurfaceTextureListener 的onSurfaceTextureAvailable()方法。
     if (!previewTexture.isAvailable()) {
             previewTexture.setSurfaceTextureListener(textureListener);
         } else {
             startPreview();
         }
    
    1. 在onSurfaceTextureAvailable方法中,初始化相机,设置宽高,旋转角度,并打开是相机。
//此处设置默认打开的相机,尺寸等常规初始化操作,并通过CameraCharacteristics用于获取cameraList列表。
CameraManager cameraManager = (CameraManager) getSystemService(CAMERA_SERVICE);
try {
           for (String cameraId : cameraManager.getCameraIdList()) {
               CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
               //默认打开前置摄像机
               Integer facing = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING);

               if (facing != null && facing == CameraCharacteristics.LENS_FACING_BACK)
                   continue;

               //获取图片输出的尺寸
               StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
               assert map != null;

               //摄像头支持的预览Size数组
               mPreviewSize = getOptimalSize(map.getOutputSizes(SurfaceTexture.class), width, height);
               mCameraId = cameraId;
           }
       } catch (CameraAccessException e) {
           e.printStackTrace();
       }
  1. 在openCamera打开相机的方法中,处理回调。
第一个参数指示打开哪个摄像头,第二个参数stateCallback为相机的状态回调接口,第三个参数用来确定Callback在哪个线程执行
cameraManager.openCamera(mCameraId, mStateCallback, mCameraHandler);
  1. 在 CameraDevice.StateCallback的onOpened中开启预览。
private CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {
         @Override
         public void onOpened(@NonNull CameraDevice cameraDevice) {
             mCameraDevice = cameraDevice;
             startPreview();
         }

         @Override
         public void onDisconnected(@NonNull CameraDevice cameraDevice) {
             if (mCameraDevice != null) {
                 cameraDevice.close();
                 cameraDevice.close();
                 mCameraDevice = null;
             }
         }

         @Override
         public void onError(@NonNull CameraDevice cameraDevice, int i) {
             if (mCameraDevice != null) {
                 mCameraDevice.close();
                 cameraDevice.close();
                 mCameraDevice = null;
             }
         }
     };

  1. 在startPreview方法中,获取预览区域
//首先获取SurfaceTexture
 SurfaceTexture mSurfaceTexture = previewTexture.getSurfaceTexture();
 //设置缓冲区域宽高
 mSurfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
 //通过获取Surface获取预览区域
 Surface previewSurface = new Surface(mSurfaceTexture);
  1. 在startPreview方法中,创建预览的请求CaptureRequest,创建CameraCaptureSession对象。
//设置模式为预览模式
mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
//发送预览请求
 mCameraCaptureSession.setRepeatingRequest(mCaptureRequest, null, mCameraHandler);
  1. 销毁camera2
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mCameraDevice != null) {
            mCameraDevice.close();
        }
        if (mCameraCaptureSession != null) {
            mCameraCaptureSession = null;
        }
    }

源码:

github地址: https://github.com/zcyyouminghuo/Camera2_demo
CSDN资源: https://download.csdn.net/download/qq_42625299/12410285

猜你喜欢

转载自blog.csdn.net/qq_42625299/article/details/106066011
今日推荐