AndroidでQRコード

twcritique

とにかくZXing推し

以上のように、全体像が見えてしまえば ZXing スキャナの操作性を支えているのは意外なほどシンプルなしくみであることがわかります。それを自作のコードに組み込むことは難しくなさそうですね。そこで ZXing スキャナの実装に倣いつつできるだけ短いコードでざっくりとリーダーを作ってみることにしました。認識結果はダイアログ表示のみとしています。動作確認は一部の環境でのみ行っており、不具合があれば適宜手を入れて下さい。

QRコードのライブラリは ZXing を使う。 google が開発しオープン化されている物。

ここから落せる。

http://code.google.com/p/zxing/
しかし、現行の ZXing-2.2.zip にはソースしか入っていないので以下から2.3-SNAPのjarを落してきた。

「ZXing」ライブラリを使う、2.0もしくは2.1が扱いやすい。libsにcore.jarとjavase.jarをぶち込み、「Javaのビルド・パス」からこの2つを指定して使う。ソースは多分そこらじゅうに落ちてるけどGitHubかどっかに貼っておく。

Apache License 2.0
https://code.google.com/p/zxing/
「ゼブラクロッシング」読ませたいらしい。Xi を見ても「クロッシィ」と読めないので無理そう。「サイ」と。で、QRコードを作るならこれらしい。バーコードバトラー作り放題だっ!

Space Explorer Mike@MichaelGalanin

How QR code works. pic.twitter.com/Z0YAwk8RsL

欲しい人もたくさん居るっぽいので、とりあえず出来たもののAndroidプロジェクトをそのまま配布します。ライセンスは元のApache licenseを踏襲ということで。

Bitmapから解析する機能を付けたバーコードスキャナのプロジェクト

Bitmapから解析する機能を付けたバーコードスキャナ本体(デバッグキー版)

で、本来はAndroidマーケット上で流れているアプリに取り込まれてくれたほうが楽だと思うので,Google Code上のプロジェクトにパッチを提供しました。テスト用のActivityも付けたので,使い方知りたい方はこちらも御覧ください。

JDKに含まれていて、Android-SDKに含まれないクラスがjar内に使われている場合、 当該箇所をAndroid-SDKで表現するように置き換える必要があるという意味です。
例えば、jar内にjava.awt.image.BufferedImageクラスが使われている場合、 Android-SDKではこのクラスを含んでいませんので、このクラスを使わないようにパッチをあてる必要があります。

ここやらここでzxingのライブラリの一部を使用して簡単にスキャンできる事は書かれている。

ただ、上記の
リンクのコードを使用してカメラから読み取ろうとするとNotFoundExceptionが出てしまう。
カメラからの取り込み画像が解像度など諸々の理由でうまくいかない。
オートフォーカスとか付けると更に複雑化してしまう。

インテント

プロジェクトに取り込む方法は下記の通り:
“project” => properties => Java Build Path => Librariesタブ => Add JARs… => core.jarを選択
new packageでcom.google.zxing.client.androidを作成し、ダウンロードしたPlanarYUVLuminanceSource.javaをコピーして配置します。

BinaryBitmapオブジェクトさえ作れてしまえば、あとはJava SEの場合と同様の手順でデコードを行える。以下に、SDカードに保存されたQRコード画像(mycode.png)の内容を読み取って表示するコードの例を示す。

Bitmapを作るところはandroid特有のものですね。

他はpure javaで使えると思います。

2.自作アプリから、IntentIntegratorのinitiateScan()メソッドを実行する
※内部で、バーコードリーダーがstartActivityForResult()されます。

3.読取に成功、または失敗すると
onActivityResultに戻ってくるので、staticメソッド
public static IntentResult parseActivityResult(int requestCode, int resultCode, Intent intent)
を使用して、認識されたバーコードを取り出します。

ZXing を利用してAndroidアプリを開発するには
Ant のダウンロード
ZXing ライブラリのダウンロード
core.jar の生成
プロジェクトへの導入
Androidアプリの開発

いまさらですが、アンドロイドでバーコード読み取りをやってみます。

ライブラリとして使用するのは、SATCHのシナリオサンプルとZXing(ゼブラ・クロッシング)の2つです。

ZXing(ゼブラ・クロッシング)を使えば、一次元も二次元(QRコード)も両方いけます。

つまりWebアプリや例えば業務系のサイトなんかで、QRコードスキャナーを使ってバーコード(JAN/EANでもQRコードでもISBNでも)を読み込んでその結果を持ってページに戻ってきてもらうようなことが可能なわけです。わざわざ専用のWebViewアプリを作らなくても!

Google ChartsでQRコード生成したことはあるけど、Webにつながっている必要があるんですよね。
ライブラリはないもんかと調べたら、Zxingを使えばネットワーク環境なしに作成できることがわかった。
QRコード生成だけでなく、QRコードのデコードもできるみたい!

今回は QRコード生成をやってみた。

ちなみに「ゼブラクロッシング」と読むそうです。
(読めないよ・・・)
この ライブラリ 、
「 QRコード スキャナー」という名前で普通にリリースされてたりします。

やや話がそれるが、QRコードの生成だけならGoogle Chart API で可能なようだ。

Google Charts — Google Developers

生成だけで読み取りはないが、アップロードしたQRコードの画像を読み取るサービスもそのうち出てくるだろうと思った。

QRCodeReader.decodeを利用すると、Resultに読み込み結果が格納され、
QRコードが見つからない場合はNotFoundExceptionをthrowします。
decodeにQRコードを渡す場合、BinaryBitmapインスタンスに加工する必要があります。
今回は、こちらを丸々コピーしてきて加工はお任せしています。

https://github.com/nasneg/SampleQR

コメント書いてないからわかりづらいですね。すみません。。。
動作としては起動後にカメラプレビューを表示し、画面タッチをした際にオートフォーカス実装後、QRコードの読み込みを開始する。
といったかんじです。
肝となるのはPlanarYUVLuminanceSource。
引数は順に、byte配列の画像データ、プレビューサイズの横幅、プレビューサイズの高さ、読み取りエリアの開始X座標、読み取りエリアの開始Y座標、読み取りエリアの横幅、読み取りエリアの高さ、反転の有無です。

ここで出てくる PlanarYUVLuminanceSource ですが、これは読み取る対象のデータの範囲などを設定するクラスです。引数は以下の様な感じです。

androidアプリでバーコードを読み取るために、ZXingライブラリを使用することもできるが、
QRコードスキャナーというアプリを経由してバーコードを読み取ることもできる。
QRコードスキャナーの呼び出しにはインテントを使用する。

QRコードスキャナーの呼び出し

QRコードスキャナーをインテントで呼び出す。
QRコードスキャナーが端末にインストールされていなければ、AndroidMarketを起動する。

https://matome.naver.jp/odai/2139228840234821401
2020年03月11日