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

前言:现在很多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 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));

谢谢大家观看!


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

你可能感兴趣的:(Android)