Android 如何產生 QR Code

這篇文章說明如何使用 ZXing library 來產生 QR-Code。

應用程式執行的畫面如下,可以看出有一個 QRCode,而且 QRCode 的中間還有一個 logo。QRCode 是如何產生的呢?是讀取最上方 EditText 中的文字所產生的。



如果使用 QR code android 這幾個關鍵字來搜尋 Google 的話,就會發現大部分文章都指向 ZXing (Zebra Crossing) 這個函式庫。不過 ZXing 並不是針對 Android 設計的,要把 ZXing 導入到 Android 要花費一番的心力。

好在網路上已經有神人寫好的 Android 對應的 ZXing 函式庫了,所以我們直接套用即可。這套函式庫叫 zxing-android-embedded ,看名字就知道和 ZXing 有關係了。

zxing-android-embedded 可以產生 QRCode,也可以掃描 QRCode,這篇文章說明如何產生 QRCode。


如何將函式庫匯入 Android Studio 中


首先先新創一個專案,到 build.gradle 中修改對應的設計(如下圖紅框處)。


主要是加入下圖紅框處的設定檔,匯入 Zxing-android-embedded 的函式庫。設定檔中的 jcenter 是一個有名的線上函式庫,這個線上函式庫彙集了許多有名的 Android 函式庫供我們工程師使用。所以當我們建構我們的專案時,Android 會到 jcenter 這個函式庫中,把對應的 Zxing 的函式庫給匯入到我們的專案中。



對應的設定檔如下



記得修改完 build.gradle 後,要按右上角的 Sync Now 來同步一下設定,這樣才能編譯成功。

應用程式畫面

接著編寫產生 QRCode 的畫面,如下圖所示。基本上就是一個 EditText,用來輸入所要編碼的文字。一個按鈕,用來發動 QRCode 編碼,以及一個 ImageView,用來展示 QRCode。


版面佈局的程式碼如下


產生 QRCode

那 Zxing-android-embeddedd 可以產生 QRCode 嗎?

網路上用關鍵字 "zxing-android-embedded generate qr code" 一搜,立馬就找出解答了!

答案就是呼叫 BarcodeEncoder 這個類別來完成。

再努力 Google 一下,很快的就會找到對應的說明文件。因此就完成底下的程式碼了。


Try...catch 所包起來的部分,就是 BarcodeEncoder 的主要程式碼。我們呼叫 encodeBitmap 產生一個 QRCode 的 bitmap,並且將之指定給我們的 ImageView,將之畫出。

encodeBitmap 有四個參數:

  1. 所要編碼的內容,是一個字串 
  2. 所要編碼的格式,我們選用 QR_Code,其他格式可以參考 ZXing 的 GitHub 庫的說明。.
  3. 接下來兩個參數對應了圖片的 width 以及 height

在 QRCode 中加入 logo 

這是比較炫的用法。有些公司會在 QRCode 加上自己的 logo,讓 QRCode 比較炫一點。

作法是把產生的 QRCode 上,再疊上自己的 logo 的圖片即可。


addLogo 函式接收原本的 QRCode 的圖片,之後會回傳一個加入 logo 的 QRCode 圖片。

程式碼的第 3 行由 resource 中匯入圖片,並轉成 bitmap 物件。

之後就是計算圖片的大小,並產生對應的縮放。然後將兩張圖片疊加,最後回傳。

程式碼如下



最後,應用程式的執行畫面如下:


留言

  1. 教學佷清楚,但是有時候產生出來的QR CODE SCANNER無法辨認
    可以試試修改Bitmap容錯度

    Map hints = new EnumMap(EncodeHintType.class);
    hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

    然後加到encodeBitmap中,
    Bitmap bit = encoder.encodeBitmap(etContent.getText().toString(), BarcodeFormat.QR_CODE, 500, 500,hints);

    回覆刪除
  2. 你好 如果我想要把兩個EditText混合再一起變成QR code
    Bitmap bit = encoder.encodeBitmap(outputText.getText().toString()+outputText2.getText().toString(),BarcodeFormat.QR_CODE, 250, 250);這樣寫編譯會過,但是執行時會直接當掉
    請問要怎麼作修改?

    回覆刪除
  3. 如果想把 產生的QRcode 存入資料庫 再來抓取 這樣要如何做呢?

    回覆刪除

張貼留言

這個網誌中的熱門文章

由 Pandas 的 DataFrame 中取得資料

[程式設計] C++ 的字串切割

[C++]在 cin 後呼叫 getline 所遇到的問題