前言
因为准备参加比赛的项目涉及到android 相机,所以记录一下这几天学到的有关camera2 API的使用。
GitHub地址 这是谷歌camera2的相机示例,网上大部分代码和讲解都是参考这个来的,我也是通过看这些代码和别人的博客来学习的。
上面的这个代码,谷歌已经没有更新维护了,最新的有关相机示例的GitHub仓库地址是这个:最新相机示例GitHub地址 这些示例使用的是kotlin语言,上面旧的使用java。
这里放一些我看过的比较不错的相关博客教程,也方便自己以后回顾:Android Camera2 教程 · 第一章 · 概览Android 音视频开发(三) – Camera2 实现预览、拍照功能Android Camera2Demo学习
我的总结
首先,这是我学习后 画的camera 2 相机预览代码的流程图
你可以先看一遍谷歌camera2实例代码,然后再来对照这个图和我下面说的步骤,这样你对整个代码流程就比较清晰了。
从获取相机服务到展示预览画面,用到的部分camera2 API流程如图所示:
然后我再用文字描述一下:
第一步,在布局文件中添加TextureView控件,该控件用于展示预览画面。在代码中给该控件实例设置监听SurfaceTextureListener,在onSurfaceTextureAvailable()方法中(该方法会在SurfaceTexture准备好后调用)执行以下步骤;
第二步,获取相机服务得到相机管理类实例CameraManager;
第三步,调用cameraManager实例的getCameraIdList()方法,在得到的相机id列表中选择一个你要的相机id;
第四步,调用getCameraCharacteristics(cameraId)方法,传入相机id,得到装有该相机配置信息的CameraCharacteristics实例。通过characteristics.get(参数)方法可以获取该相机的朝向(前置,后置)、传感器方向、是否指支持camera2高级特性 等信息,以及通过characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputSizes(SurfaceTexture.class)可以得到相机支持的预览尺寸列表,进而选取最合适的预览尺寸;
第五步:调用cameraManager的
openCamera(cameraId,CameraDevice.StateCallback,handler)方法打开相机,在StateCallback的onOpened()方法中得到CameraDevice实例;
第六步:配置用于展示画面的surface,通过
new Surface(textureView.getSurfaceTexture())得到surface实例对象;
第七步:调用CameraDevice实例的createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)方法得到CaptureRequest.Builder,调用它的addTarget(surface)方法和surface进行绑定,再使用build()方法创建CaptureRequest实例对象;
第八步:调用cameraDevice的createCaptureSession()方法,在回调中拿到
CameraCaptureSession实例,用该实例的
setRepeatingRequest(captureReques,callback,handler)方法开始预览。
则此,你就能在手机上看到预览画面了,拍照功能我没有继续看,因为要做的项目没有拍照这个需求。
上面是我大概的思路总结,很多方面没有说到,例如 选取最优预览画面,修复预览方向等
0