AndroidでQRコードのバイナリデータを取得する

AndroidでもiOSでもQRコードリーダアプリがたくさんありますが、QRコードのテキストデータ(URLとか)を読み取るものがほとんどと思います。

でも、QRコード自体はバイナリデータを含むことができます。3DSのソフトが発行するQRコードとかね。

今回はそんなQRコードのバイナリデータを Androidで取得する方法を紹介します。

「いや、サンプルとかいいからバイナリデータを読めるアプリが欲しいんだ」という方は、今回紹介するコードを組み込んだアプリを私がリリースしてますのでどうぞ

Android/iOS両方あるよ。是非ともご利用ください。ぜひ!

気を取り直して、AndroidでQRコードのバイナリデータを取得する方法です。

例によってコードの全文はgithubにあげてますのでそちらも参考にしてください。

動作確認環境

  • macOS High Sierra 10.13.1
  • Android Studio 3.0
  • ZXing Android Embedded 3.5.0

準備

QRコードの読み取りには、ZXingというライブラリを使います。

ZXing はGoogleが開発している、様々な1次元/2次元バーコードの読み書きができるオープンソースのライブラリです。

多くの言語にポーティングされており、ZXingを直接利用することも出来ますが、ここではZXingをAndroid用により扱いやすくしたZXing Android Embeddedというライブラリを使います。

ZXing Android Embedded のライブラリの Github にも導入方法ありますが、アプリケーションの build.gradle で

を追加することで使えるようになります。(Android Studio 3.0 より前のバージョンの場合は implementation ではなく compile)

以前は ZXing のコアライブラリもアプリに取り込む必要があったのですが、ZXing Android Embedded 3.0 以降はライブラリ単体のみ取り込めば動作するようになったそうです。

コード

ZXing Android Embedded の Activity を呼び出して使う方法もありますが、レイアウトに自由度がある、DecoratedBarcodeView というビューを配置する方法を紹介します。

レイアウトファイルに DecoratedBarcodeView を追加

通常のビューと同様に、レイアウトファイルで DecoratedBarcodeView を配置します。

例えば下記のような感じで。

このビューを配置した範囲にカメラ画像が写ります。特に設定とかしなくてもガイドとメッセージが出ます。

こんな感じで。(下部の START SCAN のボタンは自分でつけてます。)

コード追加

続いて、QRコード読み取りのコードを追加します。

パーミッションチェックなどを省いて、QRコード処理部分だけを抜き出します。

手順としては、

  1. DecoratedBarcodeView を取得
  2. DecoratedBarcodeView#decodeSingle でリスナ登録
  3. DecoratedBarcodeView#resume で読み取り開始

です。

リスナで読み取り結果が BarcodeResult というクラスで通知されるので、そこから中身を取り出していきます。

よく利用されるテキストデータは、text というプロパティで取得できますが、バイナリデータは resultMetadata という別のプロパティにmapの一部として格納されています。

バイナリデータは、ResultMetadataType.BYTE_SEGMENTSというキーの値として保存されています。(バイト配列の配列として保存されています)

読み取り結果については ZXing のコアライブラリの方の Result クラスに対応していると思われますので、ResultクラスのAPIリファレンスも合わせて読むと理解が深まるかと。

細かい部分は github をご覧ください。

ちなみに上記サンプルはKotlinで書いてるので、Javaで同様のことをする場合はgetText()、getResultMetadata()で取得できます。

テスト

テキストデータから生成されたQRコード

こちらの画像のQRコードを読み込んだ場合。

このサイトのURLを埋め込んだソースになります。

結果のログ

テキストでURLが入っていて、バイナリデータとしてはURLがそのままコードになっている感じですね。

バイナリデータから生成されたQRコード

こちらの以前3DSのゲームアイテム配布用に作られたバイナリのQRコードの場合。

結果のログ

テキストの方は化けてしまっていますが、バイナリ列は問題なく取得できていました。当然ながら、何を意味するバイナリ列なのかはわかりません。

さいごに

QRコード回りはAndroidもiOSでも標準ライブラリである程度読み込みなどできるようになってきてますが、ことバイナリデータになるとなかなか取得する方法がないのが現状です。

今回はAndroidでしたが、ZXing を使うとiOSでも同様のことができます。

今回の記事で反響がありそうであれば、iOS版の方も書いてみたいと思います。


最後まで読んでいただきありがとうございます。 このブログを「いいな」と感じていただけましたら、Twiter にてフォローいただけるとうれしいです。ブログ更新情報などもお届けします。



この記事をシェアする




りゅーた
フリーランスのエンジニアしてます。Android、iOS アプリの開発、対向サーバの開発、C/C++のライブラリ開発が現在のメイン。趣味はテニス・ゲーム・自転車。2児の父

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA