2014-05-18

【Android】讓 ZXing 代勞,掃描 QR碼(QR code)

ZXing 是有名的開放原始碼的 QR 碼掃描 app,並且也開放提供函式庫,可與其他 app 協同運作。

想讓自己的 app 具有掃描 QR 碼的功能,最簡單的方式就是手機要先安裝 ZXing,再由您的 app 透過 Intent 呼叫 ZXing 代掃描 QR 碼。



LinearLayout 內放一個按鈕 和 一個 TextView,按鈕用來呼叫 ZXingTextView 顯示 ZXing 傳回的結果。




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

...
...

public void onButton1Click(View v) 
{
    Intent intent = new Intent("com.google.zxing.client.android.SCAN");
    if(getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size()==0)
        {
            // 未安裝
            Toast.makeText(this, "請至 Play 商店安裝 ZXing 條碼掃描器", Toast.LENGTH_LONG).show();
        }
    else
        {
            // SCAN_MODE, 可判別所有支援的條碼
            // QR_CODE_MODE, 只判別 QRCode
            // PRODUCT_MODE, UPC and EAN 碼
            // ONE_D_MODE, 1 維條碼
            intent.putExtra("SCAN_MODE", "SCAN_MODE");
    
            // 呼叫ZXing Scanner,完成動作後回傳 1 給 onActivityResult 的 requestCode 參數
            startActivityForResult(intent, 1);
        }
}

 
// 接收 ZXing 掃描後回傳來的結果
public void onActivityResult(int requestCode, int resultCode, Intent intent) 
{
    if(requestCode==1) 
    {
        if(resultCode==RESULT_OK) 
            {
                // ZXing回傳的內容
                String contents = intent.getStringExtra("SCAN_RESULT");
                TextView textView1 = (TextView) findViewById(R.id.textView1);
                textView1.setText(contents.toString());
            }
        else
            if(resultCode==RESULT_CANCELED) 
            {
                Toast.makeText(this, "取消掃描", Toast.LENGTH_LONG).show();
            }
    }
}





因為模擬器沒有安裝 ZXing,所以按了 Button1 時,會出現提示訊息,要使用者去 Play 商店下載安裝 ZXing



在有安裝 ZXing 的實體手機執行這個 app,它就會呼叫 ZXing



並將掃描結果回傳到 TextView 顯示,在本例中,我掃描了維基百科的  QR 碼這個主題中的 QR 碼,那個 QR 碼就是維基百科的網址。


相關筆記 ----
利用 ZXing 生成 條碼 / QR code
結合 ZXing 掃描 QRcode
Genymotion 模擬器執行 Epson 範例 app,連接 TM-T70II 微型印表機列印單據