Android 自定义Camera翻转摄像头
前言
Android camera开发中常常会涉及到 翻转摄像头,这篇问篇文章会为大家讲解如何翻转摄像头。
官方api
open和open(int arg)的关系
在之前的文章中,我们使用open()成功获取到了后置摄像头,大家有没有好奇,为什么是后置摄像头而不是前置呢,我们一起看一下open()的实现
解释一下:
第一步,获取到设备的硬件层的摄像头数量
第二部,创建一个Info容器
第三步,遍历摄像头
为info赋值,如果info的id == CAMERA_FACING_BACK则返回Camera对象,否则return null.
open(int org)的实现
可以看到open(int org),省略了open()类的遍历判断,完全信任了调用者的传参。
思考一下:
首先,Camera为我们定义了CAMERA_FACING_BACK,CAMERA_FACING_FRONT,后置摄像头和前置摄像头的ID,那么系统为什么要遍历所有摄像头呢,
这说明了硬件层可能不包含任何摄像头,所以在操作open(int arg)时需要提前判断,硬件层面是否包含前置或者后置摄像头。
感兴趣的朋友可以看一下华为荣耀i7(单摄像头设备)
切换摄像头的具体实现
第一步,定义一个全局变量来记录当前的相机ID
private int cameraType = Camera.CameraInfo.CAMERA_FACING_BACK;
第二步,定义一个函数用来获取摄像头
public static Camera getCamera(int cameraType) {
int numberOfCameras = Camera.getNumberOfCameras();
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
for (int i = 0; i < numberOfCameras; i++) {
getCameraInfo(i, cameraInfo);
if (cameraInfo.facing == cameraType) {
return Camera.open(i);
}
}
return null;
}
第二部,在点击按钮的响应
/**
* 判断Camera状态,为空则重新初始化
*/
if(null != mCamera) {
/**
* 实例化新Camera之前需要释放掉之前实例化的Camera,否则会出现异常,
* 但并不是所有的设备都会出现异常
*/
mCamera.stopPreview();
mCamera.release();
mCamera = null;
Camera camera = getCamera(cameraType == Camera.CameraInfo.CAMERA_FACING_BACK
? Camera.CameraInfo.CAMERA_FACING_FRONT
:Camera.CameraInfo.CAMERA_FACING_BACK);
if(null != camera) {
cameraType = cameraType == Camera.CameraInfo.CAMERA_FACING_BACK
? Camera.CameraInfo.CAMERA_FACING_FRONT
:Camera.CameraInfo.CAMERA_FACING_BACK;
mCamera = camera;
mCamera.setDisplayOrientation(90);
setCameraSize(mCamera,
ScreenUtils.getScreenHeight(this)
, ScreenUtils.getScreenWidth(this));
try {
mCamera.setPreviewDisplay(mPreview.getHolder());
} catch (IOException e) {
e.printStackTrace();
}
mCamera.startPreview();
} else {
initCamera();
try {
mCamera.setPreviewDisplay(mPreview.getHolder());
} catch (IOException e) {
e.printStackTrace();
}
mCamera.startPreview();
}
} else {
initCamera();
}