Android添加二维码扫描zxing

/ Android / 没有评论 / 3868浏览

一、简介

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

开源项目地址: https://github.com/zxing/zxing

该项目功能很多,我们仅仅是用到里面Android的部分。早已有一些大神将核心的扫描等功能提取出来了。我们只需要集成到项目中使用即可。现在已经到3.3版本,修复了旧版本很多bug,有的bug甚至会导致APP奔溃!建议升级到新版本。

二、集成方法

DEMO地址:https://github.com/HappyMiao/QrCodeScan

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();
      }
  }

四、部分源码类介绍

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

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

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

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

  5. DecodeHandler.decode ZXing解码的核心类

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