Android Camera2的使用
一、使用前准备
- Api 版本控制:API>=21
- 权限检查:
<!--相机权限-->
<uses-permission android:name="android.permission.CAMERA"></uses-permission>
二、开始使用
摄像头变量
- CameraCharacteristics.LENS_FACING_FRONT:前置
- CameraCharacteristics.LENS_FACING_BACK:后置
- CameraCharacteristics.LENS_FACING_EXTERNAL:额外(双摄像头)
三、功能使用
首先得判断一下设备是否支持camera2功能
传送门
API 21要求实现Camera2 API,虽然厂商实现了这些API,但实际上可设置的参数比Camera少,甚至性能都比Camera差。Camera2留给厂商一条退路,可以指明设备对Camera2的支持程度,结果好多不乏主力设备机型,都是最低支持程度。
通过
CameraCharacteristics characteristics
= manager.getCameraCharacteristics(cameraId);
characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
可以得到对Camera2的支持程度,具体描述在INFO_SUPPORTED_HARDWARE_LEVEL中有介绍。得到的int值在CameraMetadata中定义,其中FULL值为1,LEGACY值为2,LIMITED值为0,其支持程度为FULL > LIMITED > LEGACY。
手动对焦:
先关闭自动焦距模式 mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_OFF);
mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF);再设置上焦距值 mPreviewBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, 焦距值)
关于预览画面变形问题(仿微信,全屏拍摄)
这里有几个尺寸需要分清楚
1. surfaceView的尺寸,也就是显示画面的尺寸。
2. 摄像头支持的尺寸
3. surfaveView buffer的尺寸,这个尺寸往往是最容易忽略设置的。我们可以在打开摄像头的回掉里面去设置buffer尺寸的大小。
// We configure the size of default buffer to be the size of camera preview we want.
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
以上几个尺寸不一致都会导致变形的问题
使用过程中遇到的问题
录制的方向问题
并不是许多demo里面所说的使用
getWindowManager().getDefaultDisplay().getRotation();
去判断,这个角度只有用户开启自动旋转的时候才有效果。但是像系统相机,还是微信的相机在关闭自动旋转的情况下,录制也会屏幕旋转的,而是靠重力感应去判断屏幕的旋转方向。最明显的效果是微信的相机icon会根据旋转的角度改变。
四、参考引用
[1]: 极客学院android.hardware.camera2 使用指南
[2]: Android平台Camera开发实践指南
[3]: Android 拍摄(横\竖屏)