近期需要在手机上实现一个二维码扫描的功能,决定还是自己一步一步来,顺便做一个教程,现在我了解到的二维码扫描就是得到相机返回的数据,然后用算法得到二维码信息。
因为博主的测试机是android4.3的老人机,所以此系列的博客都是用的android.hardware.Camera类,这个类已经被谷歌抛弃,推荐使用新的类Camera2(android5.0)。
第一步,首先是将相机得到的数据显示到手机预览上。
这一步基本原理很简单。
首先创建一个Camer对象:
camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
创建camera对象不是new一个那么简单,因为一般手机有两个摄像头,所以要确定打开哪一个摄像头,所以需要传入参数Camera.CameraInfo.CAMERA_FACING_BACK(后置摄像头)或者Camera.CameraInfo.CAMERA_FACING_FRONT(前置摄像头)。
接着,在布局中放置一个SurfaceView,并在activity中得到它的对象。
接下来就是比较绕了。
- 初始化相机。
private void initCamera() {
try {
camera.setPreviewDisplay(surfaceView.getHolder());
} catch (IOException e) {
e.printStackTrace();
}
camera.startPreview();
}
这是最基础的,这里设置了显示相机内容的地方(surface.getHolder),并且后面的startPreview()也是必不可少。
但是,当运行的时候还是一团黑,这是为什么呢?这里只是提取相机一次返回的preview,当相机返回preview之后它就不动了,要想持续不断的得到相机返回的preview,就需要设置surfaceView。
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
initCamera();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
initCamera();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
});
这时候运行程序就可以得到相机返回的图像了。
但是问题又来了,为什么得到的相机图像是拉伸反转的呢?
原因是现在的手机摄像头都是横屏的,而显示屏是竖屏的,竖屏手机显示横屏摄像头内容的时候,会又挤压的效果。
解决方法是,设置相机的参数。
camera.setDisplayOrientation(90);
将相机的旋转90就得到正常值。
相机的优化:
自动聚焦:camera.cancelAutoFocus();