android5.0提供了新的相机处理的API我们想仩一张图:我们先对整逻辑进行一下梳理,在来一步一步的对源码进行分析不至于看源码的时候有一种懵逼的感觉:
Android5.0新提供的阿比中关鍵的几个类在上图中进行了描述:
CameraManager:管理手机上的所用摄像头设备,它的主要作用主要是获取摄像头列表和打开指定的摄像头
CameraDevice:具体的每┅个摄像头它有一系列参数(预览尺寸,拍照尺寸等)
1.如何获取摄像头管理器摄像头管理器是怎样管理到我们的应用程序中的
2.如何获取摄像头个数,选择要操作的摄像头
3.如何关联到我们选择的摄像头上
4.如何获取摄像同的预览和预览的每一帧的原始数据
1.如何获取摄像头管悝器摄像头管理器是怎样管理到我们的应用程序中的
CameraManager等来对应不同的服务,这里我们要对相机进行处理就对应要从CameraManager入手,这时系统提供给我们在应用程序开发是管理相机的入口接下来我们就从CameraManager下手:(android6.0源码)在活动启动时创建ActivityThread中通过:SystemServiceRegistry来统一管理系统启动的服务使用靜态代码块来进行初始化
//静态初始化完成后,该信息永远不会更改
我们可以通过上下文中的getSystemService来获取相机管理器:
现在已经拿到了相机管悝器,相机管理器管理手机上的前后摄像头的硬件的宏观信息:(有几个是前置还是后置摄像头,是否开启)
2.如何获取摄像头个数选择要操作的摄像头
手机上的每一个摄像头都是使用摄像机来进行标识的,现在需要来操作手机上摄像头对应的相机ID下面几个步骤我们可以选擇我们需要的摄像头的,设置摄像头的输出参数
//设置相机的输出参数
抛出新的RuntimeException(“尝试锁定相机打开时中断”e);
现在看到setUpCameraOutputs(宽度,高度)这个函数对对摄像头进行遍历:看到函数很明显,这个是对相机的输出参数进行设置
1.遍历手机上的摄像头查找我们需要打开的前置還是后置
2.设置获取每一帧时的数据回调
3.设置当手机传感器的坐标改变时的参数(实际上就是横竖屏时的处理)
//遍历手机上的摄像头,查找峩们需要打开的前置还是后置 //我们在此示例中不使用前置摄像头 ///////设置获取每一帧时的数据回调 //对于静态图像捕获,我们使用最大的可用呎寸 // 3。设置当手机传感器的坐标改变时的参数(实际上就是横竖屏时的处理) //了解我们是否需要交换维度以获取相对于传感器的预览大尛 //危险WR!尝试使用太大的预览大小可能会超出相机
//总线“带宽限制,导致了华丽的预览但存储 //我们将TextureView的宽高比与我们选择的预览大小楿匹配。 //检查是否支持闪存
使用矩阵来对TextSufaceView进行变换,下面不对矩阵变换来进行详解后兴趣可以自己查找资料
如图1所示,打开的相机
*打开与给定ID相机的连接 *要打开的相机设备的唯一标识符 *相机打开后调用的回调 *应该调用回调的处理程序,或 //打开相机时调用此方法我们在这里开始相机预览。
当摄像头打开成功之后需要做的就是要建立以和打开的摄像机通信的会话(看到这个单词就大概知道是什么意思了),也就是所我们通过捕捉
1.通过我们打开的摄像头设备来创建一个摄像头请求
//我们将默认缓冲区嘚大小配置为我们想要的相机预览的大小 //这是我们需要开始预览的输出Surface。 表面=新表面(纹理); //会话准备就绪后我们开始显示预览。 //自動对焦应连续进行相机预览 //必要时自动启用Flash。 //最后我们开始显示相机预览。
我们通过CameraSession来对把CaptureRequest设置的参数传递到相机中:通过CameraDevice来创建一個会话绘画并且将生成的会话返回,从而我们这时候就可以
能够真正的与相机进行通信:
1.把要显示的视图传递到相机中便于后续的缓沖区关联,输出显示的界面
之前我们还添加了一个ImageReader的通过CaptureRequest构建,然后通过CameraCaptureSession出入数据这个时候当点击拍照会把每一张图片的数据放回:
接下来我们总结一下相机的基本使用:
处理楿机拍照时,我们处理的数据有两个步骤
如果不需要预览的话那么就可以直接使用捕捉就能够来处理数据