主要是通过Camera.Parameters来操作相机
FLASH_MODE 开关闪光灯
首先需要申请权限,camera和autofocus权限.还有存储权限
1.利用Camera.open(int) 获取Camera实例mCamera.
可以设置前置或者后置.CameraInfo.facing就是当前摄像头是前置还是后置.
2.利用mCamera.getParameters()获取默认设置,如果需要利用setParameters进行参数设置.
DisplayMetrics获取屏幕的宽高,
getSupportPreviewSizes()获取支持的相机宽高Camera.size().计算比较出合适的Size设置给camera预览.获取的列表是横屏的,我们用竖屏的,要记得把值反过来.
parameters.getSupportedPictureSizes()可以获取支持的保存图片大小,选取一个设置.
设置rotation(90)旋转.
setJpegQuality(99) 设置照片质量
setFocusMode设置对焦模式要先获取支持的模式,getSupportedFocusModes().
getSupportedPreviewFpsRange()获取支持的帧率数组选择一个.一般在25-30就好
3.利用setDisplayOrientaion(90)函数设置正确的预览方向.
如果想跟随设置,就要结合已经旋转角度和屏幕旋转角度算出这个方向.一般都固定Activity不旋转,写90就行.
写了这个获取的照片数据角度还是不变的,需要再处理旋转.给图片旋转一下.
4.想要预览,需要配合SurfaceView,在surfaceCreated回调时.利用setPreviewDisplay(SurfaceHolder)设置SurfaceView的SurfaceHolder用于预览.
5.调用startPreview开始预览,拍照之前必须已经开始预览.
给camera设置一个Camera.PreviewCallback对象,会得到onPreviewFrame(byte[] data,Camera camera)就可以拿到Camera预览图片时的数据.
camera.setOneShotPreviewCallback(previewCallback),这样设置这onPreviewFrame方法就会被调用一次,
data数据可以用YUVImage库来处理,生成bitmap.
onPreviewFrame方法跟Camera.open运行于同一线程,所以将Camera.open放在子线程中运行.
要减少内存占用可使用这个方法 camera.setPreviewCallbackWithBuffer一般配合setPreviewCallBack使用.需要在startPreview之前调用.先大概计算一个缓存byte[]然后,camera.addCallbackBuffer(byte[]).然后只用在onPreviewFrame中调用addCallbackBuffer(data)就行了.就可以一直利用开辟的内存空间了.
6.takePicture拍摄照片,得到byte[] data 是照片的数据.
picturesize和previewsize的宽高比也要保证一致,否则会发生裁剪.
7.调用takePicture后预览会停止,想要继续预览需要调用startPreview()函数.
takePicture()传入个参数,是三个接口,
第一个,ShutterCallback,拍摄瞬间回调,通常用于播放音效.
第二个,PictureCallback,返回未经压缩的RAW类型照片.
第三个,PictureCallback,返回经过压缩的JPEG类型照片.
8.调用stopPreview()停止预览.
9.调用release()释放资源,节省资源要在Activity.onPause时停止预览,在onResume时开始预览
遇到过的问题:
1.在oppo手机5.0下,也有权限申请,直接尝试Camera.open并trycatch住,
2.背景在外面view添加黑背景.
https://blog.csdn.net/u010126792/article/details/86529646
https://blog.csdn.net/superman4933/article/details/55045676
网友评论