昨日下午小米在深圳举行8周年发布会,发布了小米8手机。小米8选用的是6.21英寸尺寸18.7:9比例三星AMOLED全面屏,分辨率为2248x1080;性能方面,搭载高通骁龙845处理器,采用三星第二代10nm LPP先进制程,全新Kryo 385架构CPU最高主频达2.8GHz,性能提升了30%。
明天就是周六啦,提前祝大家周末愉快!
本篇文章转自 郭孝星 的博客,分享了如何使用相机API,希望大家喜欢。
郭孝星 的博客地址:
https://juejin.im/user/5886d699128fe1006c455fb6
原文地址:
https://juejin.im/post/5a33a5106fb9a04525782db5
Android Camera 相关API也是Android生态碎片化最为严重的一块,首先Android本身就有两套API,Android 5.0以下的Camera和Android 5.0以上的Camera2,而且 更为严重的时,各家手机厂商都Camera2的支持程度也各不相同,这就导致我们在相机开发中要花费很大精力来处理兼容性问题。
相机开发的一般流程是什么样的?
检测并访问相机资源 检查手机是否存在相机资源,如果存在则请求访问相机资源。
创建预览界面,创建继承自SurfaceView并实现SurfaceHolder接口的拍摄预览类。有了拍摄预览类,即可创建一个布局文件,将预览画面与设计好的用户界面控件融合在一起,实时显示相机的预览图像。
设置拍照监听器,给用户界面控件绑定监听器,使其能响应用户操作, 开始拍照过程。
拍照并保存文件,将拍摄获得的图像转换成位图文件,最终输出保存成各种常用格式的图片。
释放相机资源,相机是一个共享资源,当相机使用完毕后,必须正确地将其释放,以免其它程序访问使用时发生冲突。
相机开发一般需要注意哪些问题?
版本兼容性问题,Android 5.0以下的Camera和Android 5.0以上使用Camera2,Android 4.0以下的SurfaceView和Android 4.0以上的TextureView,Android 6.0以上要做相机等运行时权限兼容。
设备兼容性问题,Camera/Camera2里的各种特性在有些手机厂商的设备实现方式和支持程度是不一样的,这个需要做兼容性测试,一点点踩坑。
各种场景下的生命周期变化问题,最常见的是后台场景和锁屏场景,这两种场景下的相机资源的申请与释放,Surface的创建与销毁会带来一些问题,这个我们 后面会仔细分析。
关于Camera/Camear2
既然要解决这种兼容性问题,就要两套并用,那是不是根据版本来选择:Android 5.0 以下用Camera,Android 5.0以上用Camera2呢?
事实上,这样是不可取的。前面说过不同手机厂商对Camera2的支持程度各不相同,即便是Android 5.0 以上的手机,也存在对Camera2支持非常差的情况,这个时候就要降级使用Camera,如何判断对Camera的支持 程度我们下面会说。
关于SurfaceView/TextureView
SurfaceView是一个有自己Surface的View。界面渲染可以放在单独线程而不是主线程中。它更像是一个Window,自身不能做变形和动画。
TextureView同样也有自己的Surface。但是它只能在拥有硬件加速层层的Window中绘制,它更像是一个普通View,可以做变形和动画。
更多关于SurfaceView与TextureView区别的内容可以参考这篇文章
Android 5.0(Lollipop)中的SurfaceTexture,TextureView, SurfaceView和GLSurfaceView
https://blog.csdn.net/jinzhuojun/article/details/44062175
那么如何针对版本进行方案的选择呢?
官方的开源库
cameraview
https://github.com/google/cameraview
给出了方案:
既然要两套并用,就要定义统一的接口,针对不同场景提供不同的实现,使用的时候也是根据不同的场景来创建不同的实例。
我们不难发现,这个接口一般需要定义以下功能:
打开相机
关闭相机
开启预览
关闭预览
拍照
开始视频录制
结束视频录制
定义好了接口,我们就有了思路,针对相机的具体特性实现相应的方案,那么另一个问题就出来了,相机在日常开发中一般作为一个SDK的形式存在供各个业务方调用,那么如何设计 出一个功能与UI相分离,高度可定制的相机SDK呢?