Android生成二维码与识别二维码(ZXing)

来源:互联网 发布:为什么服务器用centos 编辑:程序博客网 时间:2024/05/18 21:43

前言:现在很多App都集成了扫一扫功能,最常用的微信、QQ等。那么今天我们就来看看怎么样在我们自己的App中集成二维码的扫描与生成功能。OK,废话不多说,我们就开始做吧。

首先看看我们需要的开源库
[github-Zxing官方库的地址 ]:(https://github.com/zxing/zxing)

下面给大家介绍一下,ZXing库里面主要的类以及这些类的作用:

CaptureActivity。这个是启动Activity 也就是扫描器。
CaptureActivityHandler 解码处理类,负责调用另外的线程进行解码。
DecodeThread 解码的线程。
com.google.zxing.client.android.camera 包,摄像头控制包。
ViewfinderView 自定义的View,就是我们看见的拍摄时中间的框框了。

二维码的生成

**

如果只需要生成二维码功能,那么只需导入下面一个jar包就行。(最新的到3.3了,需要最新可以到下面链接下载,也可以到官网下载)
Android studio在gradle文件里添加以下:

compile 'com.google.zxing:core:3.3.0'

不是Android studio的提供jar包:下载 core-3.2.1.jar

下载core-3.3.0.jar包 http://repo1.maven.org/maven2/com/google/zxing/core/3.3.0/core-3.3.0.jar
**

生成二维码图片的核心代码:

   /**     * 第一个参数是生成二维码的内容(可以是任意字符串,超链接等等),第二三个参数表示生成二维码的宽度和高度     * @param content     * @param width     * @param height     * @return     */private Bitmap generateBitmap(String content,int width, int height) {   if (TextUtils.isEmpty(content)) return null;//这里是非空判断,更改为自己非空判断的或者删掉    QRCodeWriter qrCodeWriter = new QRCodeWriter();      Map<EncodeHintType, String> hints = new HashMap<>();      hints.put(EncodeHintType.CHARACTER_SET, "utf-8");      try {          BitMatrix encode = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, width, height, hints);          int[] pixels = new int[width * height];          for (int i = 0; i < height; i++) {              for (int j = 0; j < width; j++) {                  if (encode.get(j, i)) {                      pixels[i * width + j] = 0x00000000;                  } else {                      pixels[i * width + j] = 0xffffffff;                  }              }          }          return Bitmap.createBitmap(pixels, 0, width, width, height, Bitmap.Config.RGB_565);      } catch (WriterException e) {          e.printStackTrace();      }      return null;  }     /**     * 在二维码中间添加Logo图案     */    private static Bitmap addLogo(Bitmap src, Bitmap logo) {        if (src == null) {            return null;        }        if (logo == null) {            return src;        }        //获取图片的宽高        int srcWidth = src.getWidth();        int srcHeight = src.getHeight();        int logoWidth = logo.getWidth();        int logoHeight = logo.getHeight();        if (srcWidth == 0 || srcHeight == 0) {            return null;        }        if (logoWidth == 0 || logoHeight == 0) {            return src;        }        //logo大小为二维码整体大小的1/5        float scaleFactor = srcWidth * 1.0f / 5 / logoWidth;        Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);        try {            Canvas canvas = new Canvas(bitmap);            canvas.drawBitmap(src, 0, 0, null);            canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2);            canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null);            canvas.save(Canvas.ALL_SAVE_FLAG);            canvas.restore();        } catch (Exception e) {            bitmap = null;            e.getStackTrace();        }        return bitmap;    }

OK,至此,我们的二维码生成就说完了,就是这么简单。

二维码的识别

我们需要将GitHub上的开源项目zxing作为Library导入,在这个开源项目中有一个CaptureActivity,这个Activity专门用来扫描二维码,所以我们只需要在自己的项目中直接来启动这个Activity就可以了。不知道怎么导入的自行搜索,网上已经有很多教程了。不过现在gradle这么NB,那我们能不能直接导入依赖呢?请接下来继续看:

首先要知道Android使用Zxing常用的库有: core, android, android-core, android-integration,而我们实现识别需要的核心库是 core, android-core这两个;作为一个开源项目,库的开发者肯定已经放在了AS对应的仓库中了,那么接下来我们就只需要很简单的添加2个依赖就可以把该Demo所需的依赖库下载。

dependencies {      compile 'com.google.zxing:core:3.3.0';      compile 'com.google.zxing:android-core:3.3.0';}

是不是很简单,不需要我们去下载然后导入后处理编译问题了(省了很多事)。

之后要调用扫描只需启动CaptureActivity就可以了:
startActivity(new Intent(this, CaptureActivity.class));

谢谢大家观看!


为了向别人、向世界证明自己而努力拼搏,而一旦你真的取得了成绩,才会明白:人无须向别人证明什么,只要你能超越自己。

原创粉丝点击