文章目录
Zxing
使用
zxing
是Google
推出的用于识别QRCode、ISBN等图形码的解决方案。本文主要介绍Android
移动端对Zxing
的使用,以及官方demo
的集成。
添加依赖:
compile 'com.google.Zxing:core:3.2.1'
利用
core
包中提供的API对相机的预览帧数据data
进行解析:PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(data, width, height); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)) MultiFormatReader multiFormatReader = new MultiFormatReader(); Result rawResult = multiFormatReader.decodeWithState(bitmap); //获取结果:rawResult.getText() || rawResult.getRawBytes()
为了获取相机的预览帧数据,通常需要借助
android.hardware.Camera
等中的API自定义一个相机,这个工作需要对Camera
的相关知识具有较好理解(这里推荐一个连载篇Android相机开发系列)。所以,大部分人会选择将官方的Demo--zxing
直接拷贝至项目内,然后进行适当需改即可。
官方Demo使用
官方Demo的使用比较简单,添加依赖、拷贝java逻辑代码与资源文件至项目中即可。
使用步骤
- 添加依赖:
compile 'com.google.zxing:core:3.2.1'
- 代码与资源拷贝
- 将
android
中的逻辑包com.google.zxing
拷贝至本地项目中。- 将
android-core
中的CameraConfigurationUtils.java
添加至项目中。- 将
android
中的res
目录中的资源文件添加至项目当中(为了避免文件覆盖,可对文件进行内容拷贝而非直接的文件拷贝,同时有些文件按需添加即可,例如:valuse
及其valuse-
系类)。
Activit
调用与扫描结果的获取
- 启动CauptureActivity进行扫描
public static final int REQUEST_SCAN_QRCODE = 0X11; private void scanQRCode() { Intent scanIntent = new Intent(this, CaptureActivity.class); scanIntent.setAction(Intents.Scan.ACTION); // scanIntent.putExtra(Intents.Scan.WIDTH, 99999); // scanIntent.putExtra(Intents.Scan.HEIGHT, 99999); startActivityForResult(scanIntent, REQUEST_SCAN_QRCODE); }
- 在
onActivityResult
获取扫描结果case REQUEST_SCAN_QRCODE: if (resultCode == RESULT_OK){ Bundle bundle = data.getExtras(); String resultStr = bundle.getString(Intents.Scan.RESULT); if (resultStr != null){ Toast.makeText(this, resultStr, Toast.LENGTH_SHORT).show(); } } break;
最后需要在
Manifest.xml
中添加权限等。
现在二维码的扫描功能就基本完成了,但是依然会存在部分问题。例如:识别率敏感度不够,扫描界面不满足需求等。若要进行修改,还是要对官方Demo进行分析。下面分析官方Demo的工作流程。
工作流程分析
如果不关心工作流程可以直接飞至提高识别 机票~~~~
首先不考虑相机具体属性的参数设置。整个扫描过程分为三步:相机画面预览→捕获相机预览帧数据→处理并返回帧数据
相机画面预览
自定义相机通常使用SurfaceView
对相机Camera
捕获的数据进行展示。
回想一下,在自定义相机时,如何将
SurfaceView
与Camera
关联呢?
- 获取
SurfaceView
实例的SurfaceHolder
对象mSurfaceHolder = getHolder();
- 向
SurfaceHolder
中添加回调SurfaceHolder.Callback
mSurfaceHolder.addCallback(this);
- 在回调的
SurfaceHolder.Callback#surfaceCreated
方法中通过Camera#setPreviewDisplay
指定相机Camera
的数据处理对象。mCamera.setPreviewDisplay(holder);
- 最后调用相机进行预览
mCamera.startPreview();
为了便于理解,如下是对
SurfaceView
、Surface
和SurfaceHolder
知识的补充:
SurfaceView嵌入到Window的View结构树中就好像在Win