前言
之前用过camera1做过多路摄像头预览,但是在监听camera usb这功能出现了问题,因为热拔插原因,拔出camera usb时camera id可能会出现错乱问题,而camera1获取id方法只能通过for循环递增方法获取;而camera2可通过CameraManager.getCameraIdList()获取到所有的cameraId.而且camera1能实现的功能camera2也可以.所有最终决定用camera2开发.
我这里主要给配置功能的关键代码,剩余的只要对camera2了解的,基本都能实现; ,如果遇到什么困难的,可以在评论区问我,我都会帮忙解决.
效果图
- 主界面:
- 配置
关键代码
对camera2实现单个摄像头预览拍照的过程有了解的话,实现起来的话还是比较简单的.如果不是清楚的,建议先自己用camera2实现单摄像头的预览拍照.
- 首先创建摄像头的实体类:因为camra2不能像camera1那样通过Camera就能获取所有到相关变量,所有都需要保存起来,camera2创建相关对象时,通过实体类保存起来,使用时也要通过实体类去获取,这样每个摄像头才互不影响.
public class Camera2Information {
private String camera2Id;
private CameraDevice cameraDevice;//相机设备
private CaptureRequest.Builder previewBuilder;//捕获请求(捕获请求模式:预览,拍照等)
private CameraCaptureSession cameraCaptureSession;//捕获会话的管理(开启或停止预览)
private ImageReader imageReader;//预览,拍照数据回调
private int previewFormat;//预览格式
private Size previewSize;//预览尺寸
private Size pictureSize;//图片尺寸
private Range<Integer> previewFps;//FPS
private String previewOrientation;//预览方向
private HandlerThread handlerThread;
private Handler handler;
.....
}
- 获取能读取到cameraId,创建recyclerView.adapter的数据集.
private List<Camera2Information> camera2InfoList;
private String[] CameraIdArray = null;
public void initData() {
camera2InfoList = new ArrayList<>();
CameraIdArray = Camera2Utils.getCameraId(this);
for (String cameraId : CameraIdArray) {
Camera2Information cameraInfo = new Camera2Information();
cameraInfo.setCamera2Id(cameraId);
camera2InfoList.add(cameraInfo);
}
}
......
cameraCaseAdapter = new CameraCaseAdapter(this, camera2InfoList);
- 使用TextureView作为预览画面,在onSurfaceTextureAvailable处做打开相机设备操作;
//surfaceTexture的状态监听
private TextureView.SurfaceTextureListener mSTListener = new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
int position = (int) itemView.getTag();
//默认全部打开所有摄像头
mOpenBtn.setText(R.string.camera_case_btn_close);
mOpenBtn.setActivated(false);
openCamera(mCameraManager, camera2InfoList.get(position));
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
};
private void openCamera(CameraManager mCameraManager,