2014-05-18

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

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

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



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




  1. @Override
  2. protected void onCreate(Bundle savedInstanceState)
  3. {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_zxing_main);
  6. }
  7.  
  8. ...
  9. ...
  10.  
  11. public void onButton1Click(View v)
  12. {
  13. Intent intent = new Intent("com.google.zxing.client.android.SCAN");
  14. if(getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size()==0)
  15. {
  16. // 未安裝
  17. Toast.makeText(this, "請至 Play 商店安裝 ZXing 條碼掃描器", Toast.LENGTH_LONG).show();
  18. }
  19. else
  20. {
  21. // SCAN_MODE, 可判別所有支援的條碼
  22. // QR_CODE_MODE, 只判別 QRCode
  23. // PRODUCT_MODE, UPC and EAN 碼
  24. // ONE_D_MODE, 1 維條碼
  25. intent.putExtra("SCAN_MODE", "SCAN_MODE");
  26. // 呼叫ZXing Scanner,完成動作後回傳 1 給 onActivityResult 的 requestCode 參數
  27. startActivityForResult(intent, 1);
  28. }
  29. }
  30.  
  31. // 接收 ZXing 掃描後回傳來的結果
  32. public void onActivityResult(int requestCode, int resultCode, Intent intent)
  33. {
  34. if(requestCode==1)
  35. {
  36. if(resultCode==RESULT_OK)
  37. {
  38. // ZXing回傳的內容
  39. String contents = intent.getStringExtra("SCAN_RESULT");
  40. TextView textView1 = (TextView) findViewById(R.id.textView1);
  41. textView1.setText(contents.toString());
  42. }
  43. else
  44. if(resultCode==RESULT_CANCELED)
  45. {
  46. Toast.makeText(this, "取消掃描", Toast.LENGTH_LONG).show();
  47. }
  48. }
  49. }
  50.  




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



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



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


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