基于Camera2的预览功能
Camera2简介
Camera2讲解
源码
Camera2简介
- google在API 21种新增了camera2,区别于camera1,camera2将摄像头设备建模为管道,该管道接收输入请求以捕获单个帧,每个请求捕获单个图像,然后输出一个捕获结果元数据包以及该请求的一组输出图像缓冲区。
- CameraManager:所有相机设备(CameraDevice)的管理者,用来获取摄像头列表,初始化摄像头列表时制定打开默认摄像头等功能。
- CameraDevice:摄像头设备,用于描述了硬件设备的可用设置和输出参数,通常是CameraCharacteristics对象提供,通过getCameraCharacteristics方法获取,用于创建CameraCaptureSession和CaptureRequest。
- CameraCaptureSession:相机捕获会话,用于处理拍照和预览。
- CaptureRequest:捕获请求,定义输出缓冲区以及输出到界面(SurfaceTexture或者TextureView)。
Camera2讲解
- camera2的工作可以简单分为以下几步:
- 获取相关的权限,在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" />
- 在Android6.0以上,因为Google将camera等权限设置为危险权限,所以还需要动态获取相应的权限。
- 在xml中写出相应布局文件,此处用了TextureView,接着开启线程,判断TextureView是否已经准备就绪,回调SurfaceTextureListener 的onSurfaceTextureAvailable()方法。
if (!previewTexture.isAvailable()) { previewTexture.setSurfaceTextureListener(textureListener); } else { startPreview(); }
- 在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();
}
- 在openCamera打开相机的方法中,处理回调。
第一个参数指示打开哪个摄像头,第二个参数stateCallback为相机的状态回调接口,第三个参数用来确定Callback在哪个线程执行
cameraManager.openCamera(mCameraId, mStateCallback, mCameraHandler);
- 在 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;
}
}
};
- 在startPreview方法中,获取预览区域
//首先获取SurfaceTexture
SurfaceTexture mSurfaceTexture = previewTexture.getSurfaceTexture();
//设置缓冲区域宽高
mSurfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
//通过获取Surface获取预览区域
Surface previewSurface = new Surface(mSurfaceTexture);
- 在startPreview方法中,创建预览的请求CaptureRequest,创建CameraCaptureSession对象。
//设置模式为预览模式
mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
//发送预览请求
mCameraCaptureSession.setRepeatingRequest(mCaptureRequest, null, mCameraHandler);
- 销毁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