Android使用Camera2实现多路摄像头预览,拍照,配置参数,拔插监听功能

本文介绍了如何使用Camera2 API在Android上实现多路摄像头预览、拍照以及配置参数,并讨论了camera id在USB热拔插时可能出现的问题。提供了关键代码示例,包括获取cameraId、设置预览格式、尺寸、方向和FPS,以及如何通过实体类管理不同摄像头的配置。文章最后提及将补充拍照详细设置和USB拔插监听功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

之前用过camera1做过多路摄像头预览,但是在监听camera usb这功能出现了问题,因为热拔插原因,拔出camera usb时camera id可能会出现错乱问题,而camera1获取id方法只能通过for循环递增方法获取;而camera2可通过CameraManager.getCameraIdList()获取到所有的cameraId.而且camera1能实现的功能camera2也可以.所有最终决定用camera2开发.
我这里主要给配置功能的关键代码,剩余的只要对camera2了解的,基本都能实现; ,如果遇到什么困难的,可以在评论区问我,我都会帮忙解决.

效果图

  1. 主界面:
    多路预览
  2. 配置
    配置

关键代码

对camera2实现单个摄像头预览拍照的过程有了解的话,实现起来的话还是比较简单的.如果不是清楚的,建议先自己用camera2实现单摄像头的预览拍照.

  1. 首先创建摄像头的实体类:因为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;
.....
}
  1. 获取能读取到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);
  1. 使用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,
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值