android Camera2 API使用详解(1)

这里引用了管道的概念将安卓设备和摄像头之间联通起来,系统向摄像头发送 Capture 请求,而摄像头会返回 CameraMetadata。这一切建立在一个叫作 CameraCaptureSession 的会话中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 CameraManager 是那个站在高处统管所有摄像投设备(CameraDevice)的管理者,而每个 CameraDevice 自己会负责建立 CameraCaptureSession 以及建立 CaptureRequest。CameraCharacteristics 是 CameraDevice 的属性描述类,非要做个对比的话,那么它与原来的 CameraInfo 有相似性。 类图中有着三个重要的 callback,虽然这增加了阅读代码的难度,但是你必须要习惯,因为这是新包的风格。其中 CameraCaptureSession.CaptureCallback 将处理预览和拍照图片的工作,需要重点对待。这些类是如何相互配合的?下面是简单的流程图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有了这三张图,那么接下来就好了理解了,我们按照拍照流程的指示,来吧整个过程走一遍

1首先定义一个SufaceView 用来实现预览照片用

surfaceView=(SurfaceView) findViewById(R.id.surfaceView);

**surfaceHolder**.addCallback(**new** SurfaceHolder.Callback() {
    @Override
 **public void** surfaceCreated(SurfaceHolder holder) {
        initCamera();
    }

    @Override
 **public void** surfaceChanged(SurfaceHolder holder, **int** format, **int** width, **int** height) {

    }

    @Override
 **public void** surfaceDestroyed(SurfaceHolder holder) {

    }
});
其中initCamera2()方法是用来初始化相机的方法
2获取Camera ID,该ID是用来打开相机的关键,一般后置摄像头是0,前置摄像头是1,这里我们选择后置摄像头做详解

mCameraID = “” + CameraCharacteristics.LENS_FACING_BACK;//后摄像头


3通过Camera ID 来打开摄像头,这里我们需要使用CamerManager,这是类是一个管理服务类,值得注意的是,打开摄像头是一个相当复杂的过程,不能直接在主线程中直接执行,其核心代码为:

HandlerThread handlerThread=new HandlerThread(“Camera2”);
handlerThread.start();
childHandler=new Handler(handlerThread.getLooper());
mainHandler=new Handler(getMainLooper());


mImageReader.setOnImageAvailableListener(**new** ImageReader.OnImageAvailableListener() { *//可以在这里处理拍照得到的临时照片 例如,写入本地*@Override
 **public void** onImageAvailable(ImageReader reader) {
        **mCameraDevice**.close();
        **surfaceView**.setVisibility(View.***GONE***);
        **iv\_show**.setVisibility(View.***VISIBLE***);
        *// 拿到拍照照片数据*Image image = reader.acquireNextImage();
        ByteBuffer buffer = image.getPlanes()[0].getBuffer();
        **byte**[] bytes = **new byte**[buffer.remaining()];
        buffer.get(bytes);*//由缓冲区存入字节数组***final** Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.**length**);
        **if** (bitmap != **null**) {
            **iv\_show**.setImageBitmap(bitmap);
        }
    }
}, **mainHandler**);

cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
return;
}
//打开摄像头cameraManager.openCamera(mCameraID, stateCallback, mainHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}

注意打开摄像头需要权限:

<uses-permission android**:name=****“android.permission.CAMERA”**></uses-permission>


4 开启相机后有一个回调,stateCallback,该回调是用来返回相机是否正常打开的状态的

**private** CameraDevice.StateCallback **stateCallback** = **new** CameraDevice.StateCallback() {
    @Override
 **public void** onOpened(CameraDevice camera) {*//打开摄像头***mCameraDevice** = camera;
        *//开启预览*takePreview();
    }

    @Override
 **public void** onDisconnected(CameraDevice camera) {*//关闭摄像头***if** (**null** != **mCameraDevice**) {
            **mCameraDevice**.close();
            MainActivity.**this**.**mCameraDevice** = **null**;
        }
    }


![img](https://img-blog.csdnimg.cn/img_convert/129fe491b5cc6b3b16527b03fce11a72.png)
![img](https://img-blog.csdnimg.cn/img_convert/9539555f8a6864e048ca9545d47efae9.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

...(img-qYjeJstV-1726078780814)]
[外链图片转存中...(img-47JjPwbR-1726078780814)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值