上一篇文章Camera2 API 采集视频并 SurfaceView、TextureView 预览
主要是想理清 Camera2 的结构,并简单介绍怎么使用TextureView、SurfaceView 预览数据。
其实Camera2除了结构比较复杂,使用起来没那么复杂,而且是官方强烈推荐,加上又支持了很多新特性,自然满怀欣喜地准备做下去,可是,后面发现了好多坑啊!很多资料不全而且很多手机都不支持FULL模式,手头上的MIUI也是,无奈只好转战Camera。
这篇文章比较简单,主要是camera采集数据结合textureview预览,下面内容包括:
- 使用并封装Camera的api
- 使用Textureview
- 实现Camera手动对焦、自动对焦
- 源码
其中最重要的就是:Camera的坑!!! 包括
如何处理预览变形拉伸?
如何选择合适的预览尺寸?
如何textureview坐标转化到camera坐标实现手动对焦?
如何自动对焦?
Camera使用流程
1 . 申请权限
使用Camera必须要申请注册权限,包括在manifest申明和android 5.0以上必须主动申请
<uses-permission android:name = "android.permission.CAMERA" />
<uses-feature android:name = "android.hardware.camera" />
<uses-feature android:name = "android.hardware.camera.autofocus" />
以及主动申请权限
ActivityCompat.requestPermissions(Activity activity, String[] permisstions, int requestCode);
自己封装了个PermisstionUtil工具类,可见后面的源码链接
2 . 打开Camera
private static int mCameraID = Camera.CameraInfo.CAMERA_FACING_BACK;
// 默认是后置摄像头
mCamera = Camera.open(mCameraID);
3. 预览camera
1.设置camera接收预览的输出,可以是SurfaceTexture或SurfaceHolder:
mCamera.setPreviewTexture(surfaceTexture);
mCamera.setPreviewDisplay(surfaceHolder);
2.设置camera的方向,因为camera默认是水平的,不设置方向会发现看到的图像是不对的。
网上很多人写 mCamera.setDisplayOrientation(90)
,直接旋转90度,如果是固定screenOrientation=“portrait”,好像也没有问题,不过这里个人参考了其他的代码,先找出屏幕方向再进行设置:
mOrientation = getCameraPreviewOrientation(activity, mCameraID);
mCamera.setDisplayOrientation(mOrientation);
public static int getCameraPreviewOrientation(Activity activity, int cameraId) {
if (mCamera == null) {
throw new RuntimeException("mCamera is null");
}
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, info);
int result;
int degrees = getRotation(activity);
//前置
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {