Android添加二维码扫描zxing

作者: miaozbetter | 来源:发表于2017-02-10 13:05 被阅读19112次

一、简介

  • 现在APP的扫码功能很普遍,也有一些APP会有生成二维码的需求。目前Android大部分是集成了zxing这个开源项目的扫码功能。

  • 开源项目地址

  • 该项目功能很多,我们仅仅是用到里面Android的部分。早已有一些大神将核心的扫描等功能提取出来了。我们只需要集成到项目中使用即可。

  • 现在已经到3.3版本,修复了旧版本很多bug,有的bug甚至会导致APP奔溃!建议升级到新版本。

二、集成方法

  • QrCodeScan 这里已经集成好了一个Demo,只需按照以下步骤将此项目中的内容复制导入即可。

  • Demo默认界面

  • 打开了扫描界面,这个界面后面可以自己根据需求定制修改。

  • 生成二维码

  • 先下载上面的Demo

  • 在项目的build.gradle中添加依赖 com.google.zxing:core:3.3.0

  • 将整个包 com.google.zxing(包含路径)复制到自己的项目下。

  • 复制res下的资源文件,注意不要覆盖掉了自己项目里的内容。可以将内容复制到对应的文件里边。

    1. raw下的beep.ogg。音频文件CaptureActivity中使用,若不想用则可以自行修改CaptureActivity。

    2. value 下的attrs文件。

    3. value下的ids.xml文件。

    4. value下的string内容。

    5. value下的color内容。

    6. layout下的Activity_scanner 复制到你的layout下。

  • 在清单文件里注册Activity、添加权限

<activity 
     android:name="com.google.zxing.activity.CaptureActivity"
     android:theme="@style/Theme.AppCompat.DayNight.NoActionBar"/>
     
 <uses-permission android:name="android.permission.VIBRATE" /> <!-- 震动权限 -->
 <uses-permission android:name="android.permission.CAMERA" />
 <uses-feature android:name="android.hardware.camera" /> <!-- 使用照相机权限 -->
 <uses-feature android:name="android.hardware.camera.autofocus" /> <!-- 自动聚焦权限 -->

三、使用

  • 生成二维码

    Bitmap mBitmap = EncodingHandler.createQRCode("www.baidu.com", 300);//300表示宽高
    
  • 扫描二维码调用

    Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
    startActivityForResult(intent, REQUEST_CODE);
    
  • 扫描结果回调,重写方法onActivityResult

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
          if (resultCode == RESULT_OK) { //RESULT_OK = -1
              Bundle bundle = data.getExtras();
              String scanResult = bundle.getString("result");
              Toast.makeText(MainActivity.this, scanResult, Toast.LENGTH_LONG).show();
          }
      }
    

四、部分源码类介绍

  • CaptureActivity Zxing暴露出来进行调用的界面,在handleDecode方法中对扫码成功后的动作进行处理。

  • CameraManager getFramingRect()方法,定义了扫描的区域,可以自己修改。

  • ViewfinderView ZXing扫码窗口的绘制。

    private void drawTextInfo(Canvas canvas, Rect frame)
    修改文本绘制的位置

    private void drawLaserScanner(Canvas canvas, Rect frame)
    修改扫描线的样式。注意若使用paint.setShader(Shader shader) 方法,一定要在绘制完成后调用paint.setShader(null)。以免绘制信息出错。

  • CameraConfigurationManager 修改横竖屏、处理变形效果的核心类。

  • DecodeHandler.decode ZXing解码的核心类

  • CaptureActivityHandler

    当DecodeHandler.decode完成解码后,系统会向CaptureActivityHandler发消息。如果编码成功则调用CaptureActivity.handleDecode方法对扫描到的结果进行分类处理。

  • 如有不对的地方,欢迎大神指正。

相关文章

网友评论

  • caf488163ee8:两个问题:1.onActivityResult 的 resultCode应该是CaptureActivity.RESULT_CODE_QR_SCAN;
    2.onActivityResult 的 bundle.getString("key")的key应该是CaptureActivity.INTENT_EXTRA_KEY_QR_SCAN

    全部:
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == CaptureActivity.RESULT_CODE_QR_SCAN) {
    Bundle bundle = data.getExtras();
    String scanResult = bundle.getString(CaptureActivity.INTENT_EXTRA_KEY_QR_SCAN);
    }
    }
  • 小李杂记:请问一下楼主,在Oppo R57 6.0.1上扫描报错,“IlegalArgumentException:Crop rectangle does not fit within image data”,,请问有遇到这个问题吗?
  • 83f379da4db4:请问一下楼主,使用相机完成动态地检测物体的轮廓,改怎么获取到聚焦成功之后的那一帧图片。
  • 大俠遊:楼主您好 关于 Program type already present: com.google.zxing.BarcodeFormat请能回复下吗
  • 8df22891b476:String scanResult = bundle.getString("result");
    应该是 String scanResult = bundle.getString("qr_scan_result");
  • 2b76544c7041:集成不了,搞得我现在要一个一个地方删掉,真是坑爹
    2b76544c7041:权限申请跟Activity是同一层的标签么,我居然屁颠屁颠就贴过去了....
  • 549c0e6ffcff:感谢分享! 想请教下, 如果想在扫码页面增加一个spinner, 然后有两个选项可以选择调整扫描框的大小. 要怎么实现呢? 感觉所有参数都要初始化一次, 难道只能从新启动activity吗? 求指点
  • Venus_3840:楼主,文章中从Bundle中取返回结果的时候应该写“qr_scan_result”,写“result”无法争取得到结果。GIT上托管的代码是正确的。
  • linkin_xiao:谢谢,按照步骤很容易就实现了二维码扫码功能!
  • Liu_6_Liu:楼主你好,怎么才能使那个扫描线运动快一点?还有就是那个识别二维码的时间很长,能优化不?
    Liu_6_Liu:@miaozbetter 请问一下,扫描框中会有黑点闪现是怎么回事?那个黑点是什么?能去掉不?
    miaozbetter: @Liu_6_Liu 赞👍
    Liu_6_Liu:扫描线移动速度慢这个问题解决了,VIewFinderView中有个SCANNER_LINE_MOVE_DISTANCE的静态常量,修改这个即可!
  • 852599c51b98:集成之后很难很难识别二维码呢
  • 6d3d9128a20f:楼主, 我想问下。 扫码界面整个是黑屏的是什么原因呢? 6.0以下的手机。
    c5c419772b60:释放相机资源
  • 林茨茨诶:我扫描经常扫不出来,怎么优化呀
  • b6d22ef3eeeb:楼主你好 首先谢谢你的文章已经正确指导我能够成功扫描二维码了!我这里有个小问题,就是这个是否具备扫描相册中的图片功能呢?我看了下源码貌似有这个吧?如何使用呢 如果楼主知道的话不妨教我一下 :)
    mapboo:@mapboo 我找到了,修改这里即可切换方向,谢过
    //modify here
    camera.setDisplayOrientation(270);
    mapboo:兄弟,为什么二维码扫描页面的 图片 是上下反的,就是头朝下,请解答,测试手机 nexus 5x,谢谢
    miaozbetter: @布鲁斯_3b0a 看看相关方法调用过程吧,我也没做过这个功能
  • 格鲁特特:楼主你好,生成中文二维码扫描结果乱码怎么解决啊
    c5c419772b60:兄弟,你这句代码写在哪里了能说一下嘛?
    格鲁特特:@Happy_M 解决了 String contents = new String(s.getBytes("UTF-8"), "ISO-8859-1"); 生成时候字符串设置一下编码就好了
    miaozbetter: @李晓鹏_ 修改一下生成和扫描时候的编码方式试一试
  • 8eabe35dbfe6:楼主,我想问一下,我修改了那个扫描页面。扫描之后没有出现我需要的数据需要重新扫描,这个时候页面不是重新打开的,是关掉弹出框而已,这时候扫描就没有用了,是需要重新初始化什么东西嘛?
    ab4317c0fd10:您好,您解决这个问题了没有,我也在解决这个问题
    格鲁特特:楼主你好,demo生成中文二维码扫描乱码怎么解决啊
    miaozbetter: @一唯_ba2d 好好看看那个扫描activity吧,可能有调用其他类的地方漏掉了。
  • a101bcb6ccce:楼主想问下,如果想修改扫描二维码的 ,扫描框的位置,让他向上挪动,要修改哪里啊?
    miaozbetter: @最不6 不错,解决就好
    a101bcb6ccce:@Happy_M 我的问题完美解决了,楼主,布局文件里不能直接修改,扫描框的大小,要在CameraManager这个类getFramingRect()方法里进行修改,获得topOffset的高度这改成:(screenResolution.y - (height+height/2)) / 2;扫描框不居中的问题,就可以解决了,记录下,愿别人跳过此坑。
    miaozbetter:CaptureActivity.java 是那个扫描界面的activity。里面有布局文件的,你去那里面看看怎么修改。

本文标题:Android添加二维码扫描zxing

本文链接:https://www.haomeiwen.com/subject/dkugittx.html