Android中使用Zxing集成、分析与优化

本文介绍了在Android中如何集成Zxing进行二维码识别,包括添加依赖、使用官方Demo,详细分析了工作流程,如相机预览、帧数据捕获和处理。还探讨了如何提高识别率和进行竖屏扫描的优化。
摘要由CSDN通过智能技术生成

Zxing使用

zxingGoogle推出的用于识别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逻辑代码与资源文件至项目中即可。

使用步骤

  1. 添加依赖:
compile 'com.google.zxing:core:3.2.1'
  1. 代码与资源拷贝
  • android中的逻辑包com.google.zxing拷贝至本地项目中。
  • android-core中的CameraConfigurationUtils.java添加至项目中。
  • android中的res目录中的资源文件添加至项目当中(为了避免文件覆盖,可对文件进行内容拷贝而非直接的文件拷贝,同时有些文件按需添加即可,例如:valuse及其valuse-系类)。
  1. 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捕获的数据进行展示。

回想一下,在自定义相机时,如何将SurfaceViewCamera关联呢?

  1. 获取SurfaceView实例的SurfaceHolder对象
		mSurfaceHolder = getHolder();
  1. SurfaceHolder中添加回调SurfaceHolder.Callback
		mSurfaceHolder.addCallback(this);
  1. 在回调的SurfaceHolder.Callback#surfaceCreated方法中通过Camera#setPreviewDisplay指定相机Camera的数据处理对象。
			mCamera.setPreviewDisplay(holder);
  1. 最后调用相机进行预览
			mCamera.startPreview();

为了便于理解,如下是对SurfaceViewSurfaceSurfaceHolder知识的补充:
SurfaceView嵌入到Window的View结构树中就好像在Win

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值