昨日「バーコードを読み込むZXingライブラリを試しました」という記事を公開しました。
すると、@fkmさんから「こちらの記事も期待してます!」と以下のリンク先を連絡いただきました。
- Google Play サービスでのバーコード検出
http://googledevjp.blogspot.jp/2015/09/google-play_30.html
ZXingライブラリではなくこちらも試してみたまえ・・・とのことなので、昨夜の内にサンプルを作って試すところまではできたので、その辺をまとめておきたいと思います。
ちなみに、今回も作成したサンプルアプリはGitHubにて以下に公開中ですので、合わせてご確認ください。
試すにあたって、何も情報がなかったのでまずはサイトを見てみました。
すると、Googleのサンプルコードがあるとのことで、そちらを見ることに。
幾つかのサンプルの集合体のようですが、やりたいことはバーコード読み込みです。やりたいサンプルだけ確認したところ、ソースファイルは多いですが、アプリのエンドポイントになるソースがMainActivityを読んでみたところ、実際にはZXingと呼び出し方や結果の受け取り方に近いものを感じたため、実は使い方的に同じように使えるのでは?という仮説を立てました。
結果として、使い方はほとんど同じであったため、ほぼ30分ちょっとぐらいで動くサンプルアプリに仕上げることが出来ました。
昨日作ったアプリの動画はfacebookの以下のページで確認できます。
では、実際の作りはどのようになっているかについて、簡単に紹介します。
サンプルソースをどんどん持ってくる
上記で示したGoogleのサンプルに、barcode-readerという名前もそのままのものがあります。
その中で、構成的にはMainActivity以外がバーコード読み込みに必要な一式のソースとみて、MainActivity以外のコードを手元のプロジェクトに持ってくる作業をしました。
ですので、今回はGradleでの読みこみみたいなことはやってません。
ざっくりとですが、以下の様なソースが用意されており、それぞれの役割は以下のとおりと認識しています。
- BarcodeCaptureActivity.java: バーコード読み込みのエンドポイントになるActivity。カメラの呼び出しなどはここでやっています。
- BarcodeGraphic.java: カメラの映像上で、バーコードの位置にオーバーレイしたグラフィックを描画するためのコードです。
- BarcodeGraphicTracker.java: カメラに映しだされた映像上で、バーコードとして認識した場所を管理してます。
- BarcodeGraphicTrackerFactory.java: バーコードは複数ある可能性があるので、FactoryパターンでTrackerを都度生成する役割をしています。
後は、ui.cameraの中でカメラ関連のソースを格納してます。
バーコードの呼び出し
実際のバーコード読み込みのための呼び出しは、MainActivityに書いてあります。
@OnClick(R.id.barcodeScanButton) public void onBarcodeScanClick() { Intent intent = new Intent(this, BarcodeCaptureActivity.class); intent.putExtra(BarcodeCaptureActivity.AutoFocus, true); intent.putExtra(BarcodeCaptureActivity.UseFlash, true); startActivityForResult(intent, BARCODE_CAPTURE_REQUEST); }
IntentでBarcodeCaptureActivityを呼び出してやるという点から、コードがZXingよりも少し多めですが、書いているコードは基本的なものですし、シンプルです。
putExtraメソッドで渡すAutoFocusとUseFlashで、それぞれの有効化/無効化が行えます。
Googleのサンプルではここをチェックボックスを参照してon/offできるようにしてありましたが、サンプルではそこまではやっていません。
バーコード読みこみの結果受け取り
結果もActivityから受け取るため、onActivityResultメソッドに処理を記述する必要があります。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == BARCODE_CAPTURE_REQUEST) { if (resultCode == CommonStatusCodes.SUCCESS) { if (data != null) { Barcode barcode = data.getParcelableExtra(BarcodeCaptureActivity.BarcodeObject); Toast.makeText(this, barcode.displayValue, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "バーコードがキャプチャ出来ませんでした", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(this, "バーコードの読み込みに失敗しました", Toast.LENGTH_SHORT).show(); } } else { super.onActivityResult(requestCode, resultCode, data); } }
受け取ったIntent#getParcelableExtraメソッドでBarcodeインスタンスを取得してやれば、バーコード情報が取り扱えます。
サンプルではbarcode.displayValueの中身(ISBN番号)をToastで表示してみています。
使ってみた感想
ほぼほぼZXingライブラリと同じことを行うサンプルを作ってみたのですが、使ってみた感想として、Google Playサービスのバーコード検出のほうが認識速度がとても早いと思いました。
カメラをバーコードに向けるとすぐに対象を認識してくれたその速度も良かったですし、ZXingライブラリは残念ながら1つしか認識できませんが、Google Playサービスでは複数検出もサポートしています。
残念なのは、今のところGradleで読み込めるようなライブラリにはなっていないこと。
ライブラリ化してみるのが次のステップかなと考えています。
今回の調査は以上となりますが、参考になれば幸いです。
他にも以下のような記事を書いていますので、良ければ参考にしてみてください。
また、最近Flutterの記事を書き始めていますので、そちらも参考になる所があれば嬉しいです。
開発のノウハウに関する情報は以下にまとめて行っていますので、こちらをみてもらえtら、他のノウハウでお役に立てるものがあるかも知れません。