真的好难啊,我不会......之前没有接触过,一搜就陷入知识爆炸的海洋中毫无头绪,看了很多文章有几篇讲得很好,感谢,现在似懂非懂的状态,先梳理下,要配合代码一起看...
官方demo: android-Camera2Basic
一、相机开发的一般流程:
- 检测并访问相机资源 检查手机是否存在相机资源,如果存在则请求访问相机资源。
- 创建预览界面,创建继承自SurfaceView并实现SurfaceHolder接口的拍摄预览类。有了拍摄预览类,即可创建一个布局文件,将预览画面与设计好的用户界面控件融合在一起,实时显示相机的预览图像。
- 设置拍照监听器,给用户界面控件绑定监听器,使其能响应用户操作, 开始拍照过程。
- 拍照并保存文件,将拍摄获得的图像转换成位图文件,最终输出保存成各种常用格式的图片。
- 释放相机资源,相机是一个共享资源,当相机使用完毕后,必须正确地将其释放,以免其它程序访问使用时发生冲突。
二、相机开发需要注意:
- 版本兼容性问题,Android 5.0以下的Camera和Android 5.0以上使用Camera2,Android 4.0以下的SurfaceView和Android 4.0以上的TextureView,Android 6.0以上要做相机等运行时权限兼容。
- 设备兼容性问题,Camera/Camera2里的各种特性在有些手机厂商的设备实现方式和支持程度是不一样的,这个需要做兼容性测试,一点点踩坑。
- 各种场景下的生命周期变化问题,最常见的是后台场景和锁屏场景,这两种场景下的相机资源的申请与释放,Surface的创建与销毁会带来一些问题,这个我们 后面会仔细分析。
- 如何将功能和UI分离?
利用Fragment,将各种点击事件(点击拍照、点击切换摄像头、点击切换闪光模式等)对应的功能封装在Fragment里,业务方在用的时候可以在Fragment之上蒙一层 UI(当然我们也需要提供默认的实现),这样就可以让功能和UI相分离,集成起来也非常的简便。
三、相机SDK框架图:
- CameraActivity:相机界面,主要用来实现UI的定制,实际功能(点击事件)交由CameraFragment完成。
- CameraFragment:向CameraActivity提供功能接口,完成CameraActivity里的点击事件,例如:拍照、录像等。
- CameraLifecycle:处理相机随着Activity生命周期变化的情况,内部持有CameraManager,处理相机初始化和释放,预览的创建与销毁等问题。
- CameraManager:相机的实际管理者,调用相机API来操作相机,进行拍照和录像等操作。
- Camera/Camera2:相机API
四、Camera2
系统向摄像头发送 Capture 请求,而摄像头会返回 CameraMetadata。整个流程建立在一个CameraCaptureSession的会话中。
Camera2 API中主要涉及以下几个关键类:
- CameraManager:摄像头管理器,用于打开和关闭系统摄像头
- CameraCharacteristics:描述摄像头的各种特性,我们可以通过CameraManager的getCameraCharacteristics(@NonNull String cameraId)方法来获取。
- CameraDevice:描述系统摄像头,类似于早期的Camera。
- CameraCaptureSession:这是一个非常重要的API,当程序需要预览、拍照时,都需要先通过该类的实例创建Session。而且不管预览还是拍照,也都是由该对象的方法进行控制的,其中控制预览的方法为setRepeatingRequest();控制拍照的方法为capture()。
- 为了监听CameraCaptureSession的创建过程,以及监听CameraCaptureSession的拍照过程,Camera v2 API为CameraCaptureSes