PR/BLOG

広報・ブログ

ZXingでQRコードを連続読み取り

加藤さん

こんにちは、技術開発推進部の加藤です。
外出自粛が長く続く中、折角なので積んでる小説を消化しようと思ったのですが、
PCゲームのオンラインショップの大型セールが来てしまい、積ん読の他に積みゲーも出来てしまいました。
どうやら自粛は購買心にも必要だったようです。
さて、サザエさんの次回予告みたいな前書きになってしまいましたが、たまにはマニアックな技術ブログはどうですか?

やりたいこと

  • AndroidアプリでZXingを使ってQRコードを連続で読み取りたい。
  • バックカメラではなくフロントカメラで読み取りたい。
  • 読み取ったあとは、確認ダイアログを出したい。
  • ダイアログが閉じたときにQRコードの読み取りを再開したい。

 

困ったこと

  1. フロントカメラを使って読み取る方法がネットの海から見つからない。
  2. decodeContinuousを使って連続読み取りをすると、ダイアログを出してる最中もガンガン読み取ってログが大変なことに。

 

解決策

  1. (CompoundBarcodeView).getBarcodeView().getCameraSettings().setRequestedCameraId(1)でフロントカメラに設定できた。
  2. シングル読み取りするメソッドを作成して、ダイアログの処理後にもう一回そのメソッドを呼ぶようにした。

 

以下、実装

環境
Windows10
AndroidStudio3.6.3

 

ZXingライブラリの追加
build.garage

           dependencies {
               implementation fileTree(dir: 'libs', include: ['*.jar'])

               implementation 'com.journeyapps:zxing-android-embedded:3.0.2@aar'
               implementation 'com.google.zxing:core:3.2.0'
           }

カメラの権限を追加
AndroidManifest.xml


           <uses-permission android:name="android.permission.CAMERA"/>

xmlの記述
main.xml


           <com.journeyapps.barcodescanner.CompoundBarcodeView
               android:id="@+id/barcodeView"
               (省略)/>

Activityの実装(抜粋)
MainActivity.java


           private CompoundBarcodeView mBarcodeView;

           @Override
           protected void onCreate(Bundle savedInstanceState) {

               mBarcodeView = (CompoundBarcodeView) findViewById(R.id.barcodeView);

               CameraSettings settings = mBarcodeView.getBarcodeView().getCameraSettings();
               settings.setRequestedCameraId(1); // フロントカメラを使用したかったので設定。デフォルトはバックカメラ(0)
               mBarcodeView.getBarcodeView().setCameraSettings(settings);
               mBarcodeView.resume();

               barcodeViewSingle();
           }

           private void barcodeViewSingle() { //読み取り処理を行うメソッド
               mBarcodeView.decodeSingle(new BarcodeCallback() { //読み取りを行う
                   @Override
                   public void barcodeResult(BarcodeResult result) {
                       okDialog(result.getText()); //result.getText()で読み取り結果を取得し、ダイアログのメソッドへ
                   }

                   @Override
                   public void possibleResultPoints(List resultPoints) {
                   }
               });
           }

           private void okDialog(String str) {
               final String mStr = str;
               new AlertDialog.Builder(this)
                       .setMessage(mStr + "でOK?")
                       .setPositiveButton("OK!", new DialogInterface.OnClickListener() {
                           @Override
                           public void onClick(DialogInterface dialog, int which) {
                               // 何かしらの処理
                               barcodeViewSingle(); //もう一回呼び出すことで擬似的に連続読み取り
                           }
                       })
                       .setNegativeButton("NON!", new DialogInterface.OnClickListener() {
                           @Override
                           public void onClick(DialogInterface dialog, int which) {
                               // 何かしらの処理
                               barcodeViewSingle(); //もう一回呼び出s(ry
                           }
                       })
                       .setCancelable(false)
                       .show();
           }

 

おわりに

ちなみにバーコード読み取りライブラリの「ZXing」は「ゼブラクロッシング」と読むみたいです。
直訳すると「横断歩道」。ネーミングセンスありますね。

  • 当ページの人物画像はNIGAOE MAKERで作成しました。
一覧に戻る
ゆりちゃん

技術開発推進部ゆりちゃんからのお願い顔マークを押して、技術ブログの
感想をお聞かせください^^