show code block

2017年4月20日 星期四

third-party元件(XZing.core) ─ 生成QRCode、導入第三方(jar)

前言:

有別於掃描的用法。

這次是在App內生成QRCode。

情境可以是給她一個網址參數,或任何字串,然後產生QRcode提供掃描。

像是購物網站,當你買了物品,你想追蹤商品情況時,購物網站可以在訂單查詢內提供QRCode供你掃描查看商品跑去哪了。
可以看看這第三方 https://github.com/zxing/zxing







實作:

等等要操作到的地方



STEP 1 :先匯入專案


兩種匯入方式 兩種選擇其中一種就好,別傻傻的兩個都匯入
第一種
第一種是直接compile
compile 'com.google.zxing:core:3.2.1'
 

 第二種
先把core-3.2.1.jar下載下來。

然後就開始匯入專案了。

匯入專案的地方可以參考這一篇:
http://nikeru8.blogspot.tw/2017/03/androidyoutube-api-youtube-api.html

我在這邊使用另外一種方式,不過大同小異。

下載下來後,把core-3.2.1.jar放到你自己專案的資料夾libs內。(如果沒有此資料夾請自己創)

如果圖片太小可點擊放大
core-3.2.1.jar放入後讓我們回到Android Studio,匯入專案囉

點選左上角選擇「Project」>>  找到「libs」>> 找到「core-3.2.1.jar」 >> 點擊右鍵 >> 選擇「Add As Library...



跳出視窗選擇「app」 >> ok


專案匯入完成囉!


STEP 2:來畫我們的xml

activity_main.xml
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:clickable="true"
        android:gravity="center"
        android:onClick="onbuttonclick"
        android:text="產生QRCode" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="45dp" />
</RelativeLayout>


設置一個Button,等點擊之後生成QRCode


STEP 3:寫Code in JAVA

MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onbuttonclick(View view) {
        String QRCodeContent = "http://nikeru8.blogspot.tw/2017/04/third-partyxzingcore-qrcodejar.html";
        int QRCodeWidth = 200;
        int QRCodeHeight = 200;

        //QRCode內容編碼
        Map hints = new EnumMap(EncodeHintType.class);
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");

        MultiFormatWriter writer = new MultiFormatWriter();
        try {
            //ErrorCorrectionLevel容錯率分四級:L(7%) M(15%) Q(25%) H(30%)
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

            //建立QRCode的資料矩陣
            BitMatrix result = writer.encode(QRCodeContent, BarcodeFormat.QR_CODE, QRCodeWidth, QRCodeHeight, hints);

            //建立矩陣圖
            Bitmap bitmap = Bitmap.createBitmap(QRCodeWidth, QRCodeHeight, Bitmap.Config.ARGB_4444);
            for (int y = 0; y < QRCodeHeight; y++) {
                for (int x = 0; x < QRCodeWidth; x++) {
                    bitmap.setPixel(x, y, result.get(x, y) ? Color.BLACK : Color.WHITE);
                }
            }

            //設定給xml
            ImageView imageView = (ImageView) findViewById(R.id.imageView);
            imageView.setImageBitmap(bitmap);
        } catch (WriterException e) {
            e.printStackTrace();
        }
    }
}

完成囉!
QRCodeContent內就是QRCode產生出來的字串。


eidt(2017/06/12)
我發現如果QRCode你要放到很大很大,直接調整QRCodeWidth和Height會因為產生bitmap而有卡頓狀況。
此時可以用一個方法改善
  bitmap = Bitmap.createScaledBitmap(bitmap,
                    bitmap.getWidth() * 4,
                    bitmap.getHeight() * 4, false);


eidt(2017/11/27)
兩件事
一、控制QRCode旁邊白邊的大小
hints.put(EncodeHintType.MARGIN, 0);
 
後面的0 這個int參數,設得越大白邊就越寬
二、QRCode圖片太大有時候會造成app卡頓
使用AsyncTask http://nikeru8.blogspot.tw/2017/11/androidasynctask_26.html




文獻:
http://gnehcic.azurewebsites.net/android%E5%BB%BA%E7%AB%8Bqr-code/
https://github.com/zxing/zxing


Demo:
https://drive.google.com/open?id=0Byk75IYx-dKXT0dERGdqRVNYSEk


沒有留言:

張貼留言

協程(coroutine) - 協程為什麼要學它?

 Coroutine 協程 再強調一次 協程就是由kotlin官方所提供的線程api //Thread Thread { }.start() //Executor val execu...