5分鐘教會 Android Studio QR code 掃描器 製作 教學

註: 本篇文章已於 2022 年 11 月重新寫過,並附上專案完成程式碼,請至這裡查看新文章: 五分鐘學會 Android Studio QR code 掃描器 一步步製作教學(附上完整程式碼)


在上一篇Android Studio QR code 產生器 製作教學之後
這篇要來教大家製作QR code掃描器

在Android 5.0版本以後,要使用相機一定要先取得權限
還不會的看這邊Android Studio 取得相機使用權限

在取得完權限之後我們就可以開始了

我們這次要用的是Google Mobile Vision套件
叫他幫我們找QRcode就好了,直接省下5,000行

先到build.gradle(app)裡面implementation
implementation 'com.google.android.gms:play-services-vision:16.2.0'



到activity_main.xml拉一個TextView
和一個SurfaceView(在widgets裡面)



宣告剛剛拉的物件
SurfaceView surfaceView;
TextView textView;
CameraSource cameraSource;
BarcodeDetector barcodeDetector;

第三行是宣告相機
第四行是宣告Google的Vision套件(掃描條碼的部分)



把物件實作出來
surfaceView=(SurfaceView)findViewById(R.id.surfaceView);
textView=(TextView)findViewById(R.id.textView);

barcodeDetector = new BarcodeDetector.Builder(this)
      .setBarcodeFormats(Barcode.QR_CODE).build();
cameraSource=new CameraSource.Builder(this,barcodeDetector)
      .setRequestedPreviewSize(300,300).build();

更新:最後一行改成這樣可以自動對焦(網友Eric補)
cameraSource = new CameraSource.Builder(getContext(),barcodeDetector).setAutoFocusEnabled(true).build();



我們要在SurfaceView上面顯示東西
先輸入這行
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback(){
});

游標指著紅字按Alt+Enter(同時按)



直接點OK



會突然跑出很多程式碼
在最下面的輸入(surfaceDestroyed)
cameraSource.stop();

在關閉的同時就會關掉相機



在第一格(surfaceCreated)輸入:
if(ActivityCompat.checkSelfPermission(getApplicationContext(),Manifest.permission.CAMERA)
         !=PackageManager.PERMISSION_GRANTED)
   return;
try{
    cameraSource.start(holder);
}catch (IOException e){ e.printStackTrace(); }
讓他把相機畫面印在上面



開始寫條碼判斷
barcodeDetector.setProcessor(new Detector.Processor<Barcode>(){

});



一樣在紅字上面按Alt+Enter(同時按)

然後輸入這些
final SparseArray<Barcode>qrCodes=detections.getDetectedItems();
if(qrCodes.size()!=0){
  textView.post(new Runnable() {
      @Override
      public void run() {
            textView.setText(qrCodes.valueAt(0).displayValue);
      }
  });
}

讓他判斷是不是有掃描到條碼,有的話就顯示出來



執行結果:





留言

  1. 好像不能對焦,只針對特定大小的QR code 可以掃描,太小的或像line那種的就沒辦法掃描了(因為不能對焦)

    回覆刪除
    回覆
    1. 找到可以對焦的方法了,在
      cameraSource = new CameraSource.Builder(this,barcodeDetector).setRequestedPreviewSize(1000,1000).build();
      底下增加這行
      cameraSource = new CameraSource.Builder(this,barcodeDetector).setAutoFocusEnabled(autoFocus).build();
      就可以自動對焦囉!而且讀取速度超快的

      刪除
    2. 加這行
      cameraSource = new CameraSource.Builder(this,barcodeDetector).setAutoFocusEnabled(autoFocus).build();
      後面有需要加其他東西嗎?
      autoFocus一直顯示錯誤

      刪除
    3. 應該是(?) setAutoFocusEnabled(true)

      刪除
  2. 首先,先謝謝您的介紹,做法我都已經實作過了,但我不曉得有沒有人跟我遇到同樣的問題是部分手機掃條碼時是沒有任何反應的,究竟是手機版本的問題還是其他問題呢? 因為無法掃碼的手機我都確認過影像很清晰且對焦狀態,但是就是無法正常掃出文字出來,而我自己的手機是U11 就可以掃出來! 想問問看版主有沒有遇到此類問題,有無解決方案呢? 感激

    回覆刪除
    回覆
    1. 我在htc android5.0 上面也是可執行沒反應,經查論壇後,更新google play商店應用程式
      有幫助; 我更新後,同樣的程式就可以讀到barcode 了

      刪除
  3. 不知道為甚麼照著做,但是無法開啟鏡頭,有跟著做權限那部分.....

    回覆刪除
    回覆
    1. 你可以私訊我程式碼我幫你看看yaya789789789@gmail.com

      刪除
  4. 請問有辦法同時也掃描一維條碼嗎?

    回覆刪除
    回覆
    1. setBarcodeFormats(Barcode.QR_CODE)
      =>
      setBarcodeFormats(Barcode.ALL_FORMATS)

      刪除
  5. 請問 有辦法做 一個 掃描qr code 並 語音 讀取裡面的文字內容 這做的出來嗎

    回覆刪除
    回覆
    1. 可以使用Google TTS功能來讀取文字

      刪除
  6. 請問掃描出來的網址有辦法做成超連接,可以連網站嗎?

    回覆刪除
    回覆
    1. 可以使用html format格式來製作,但前提須將字串拆解,把網址部分取出

      刪除
  7. 謝謝 很棒的教學 很仔細而且很清楚

    回覆刪除
  8. 非常感謝 很實用 一次就成功

    回覆刪除
  9. 取得權限後需要重開才能使用是正常的嗎

    回覆刪除
  10. 請問已設立一個Button設立監聽觸發掃描功能,能夠在讀到資料後跳回原本頁面嗎?謝謝

    回覆刪除
    回覆
    1. startActivityForResult
      setResult() finish()
      onActivityResult()

      刪除
  11. 請問已設立一個Button設立監聽觸發掃描功能,能夠在讀到資料後跳回原本頁面嗎?謝謝

    回覆刪除
  12. 去 -> startActivityForResult
    回 -> setResult then finish() -> onActivityResult 接

    回覆刪除
  13. 不知道為什麼第一次載入程式安裝到手機時, 預覽畫面都出不來
    但是第二次進入程式就會出現了, 且之後也都執行正常?

    回覆刪除
    回覆
    1. 很可能是因為第一次執行時需要授權相機權限,授權完後預覽畫面沒有重新檢查是否有權限,所以依然卡在沒有權限時無法讀取相機的黑畫面

      刪除

張貼留言

如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com