天天看點

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檔案裡添加以下:

不是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 = ; i < height; i++) {  
            for (int j = ; j < width; j++) {  
                if (encode.get(j, i)) {  
                    pixels[i * width + j] = ;  
                } else {  
                    pixels[i * width + j] = ;  
                }  
            }  
        }  
        return Bitmap.createBitmap(pixels, , 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 ==  || srcHeight == ) {
            return null;
        }

        if (logoWidth ==  || logoHeight == ) {
            return src;
        }

        //logo大小為二維碼整體大小的1/5
        float scaleFactor = srcWidth * f /  / logoWidth;
        Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);
        try {
            Canvas canvas = new Canvas(bitmap);
            canvas.drawBitmap(src, , , null);
            canvas.scale(scaleFactor, scaleFactor, srcWidth / , srcHeight / );
            canvas.drawBitmap(logo, (srcWidth - logoWidth) / , (srcHeight - logoHeight) / , 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));

謝謝大家觀看!

為了向别人、向世界證明自己而努力拼搏,而一旦你真的取得了成績,才會明白:人無須向别人證明什麼,隻要你能超越自己。