Time:2018/06/21
因为项目需求,需要实现跟小猿搜题的类似的功能,系统相机直接就被排除了,原本打算是找个一个demo,改吧改吧就直接用了,找的过程中发现代码太旧了,目前6.0以上的系统很多不支持,然后按照demo的逻辑,就写一个相机。过程中发现不是代码旧了,TM是系统已经更新Camera的API了,好懵逼。所以先总结一个API21之前的代码,待我去瞅瞅Camera2,在优化现有功能。
一:Android开发两种相机的使用
1.
直接通过Intent调用系统相机组件。这种方法方便快捷,不需要去考虑Camera的各种Parameters(主要是previewSize、pictureSize方式二会详细讲解)
2.
使用相机API来定义符合自己开发需求的相机,Android提供了Camera来控制拍照。这种方法适用于定制项目专用相机界面。(在使用的过程中发现Camera已经被摒弃了,API21 中出现了Camera2这个类来代替Camera)这里主要讲一下自定义相机遇到的坑以及自己的感悟。
思路:
(1)创建显示相机的布局,SurfaceView,后面再讲WHY。
(2)在自定义View构造方法里面,得到SurfaceVIewHolder的对象
(3)在SurfaceView创建时调用Camera.open 打开相机,然后在设置用于显示拍照摄像的SurfaceHolder对象,在调用Camerade的startPreview()的方法开始预览取景。
(4)接下来再surFaceChange(Surface改变时)里面设置Camera的参数,setParameters,在这个地方因为国内厂家定制的系统,很多手机找不到自己合适的预览尺寸和图片尺寸,在这个地方我被坑了好久好久,最后一只try catch,设置固定的值,才解决。
(5)调用Camera的takePicture()方法进行拍照。
(6)最后就是stopPreview,和release()释放资源。三个地方需要,在takePicture之后需要在回调里面进行stop,在surFaceDestory里面也要进行stop,还要在定义一个方法对外提供stop。
直接开怼:
自定义相机肯定跟自定义View肯定分不开,按我的理解,我感觉是用自定义View来承载相Camera的画面。