今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

Androidアプリでバーコードを読みたいんだけど

ぐぐれば、zxing を使えばいいってことはすぐに分かる。
さて、どういうコードを書けばいいのかを調べてみるが、いろいろとめんどくさいことを書いてあるブログなどを発見。
zxing をダウンロードして、android アプリのサンプルが含まれているので、そのコードを読んでみようかと思ったけど、意外とボリュームがある。
zxing のサイトで、Wikiをチェックしてたら、こういうページを発見。
ScanningViaIntent - zxing
既にQRコードスキャナーをインストール済みなら、これだけのコードで読み取れるらしい。

public Button.OnClickListener mScan = new Button.OnClickListener() {
    public void onClick(View v) {
        Intent intent = new Intent("com.google.zxing.client.android.SCAN");
        intent.setPackage("com.google.zxing.client.android");
        intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
        startActivityForResult(intent, 0);
    }
};

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == 0) {
        if (resultCode == RESULT_OK) {
            String contents = intent.getStringExtra("SCAN_RESULT");
            String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
            // Handle successful scan
        } else if (resultCode == RESULT_CANCELED) {
            // Handle cancel
        }
    }
}

ほほー。

じゃあ、Activityを呼び出すところで例外処理を追加して、zxingのActivityが無かったら、ダイアログを表示するコードを追加して、zxingのQRコードスキャナーのインストールを促す。

    Intent intent = new Intent("com.google.zxing.client.android.SCAN");
    intent.setPackage("com.google.zxing.client.android");
    try {
        startActivityForResult(intent, REQUEST_CODE);
    } catch (ActivityNotFoundException e) {
        showDialog(R.id.download_barcode_scanner);
    }

で、onCreateDialog() ダイアログを表示してダウンロードするかどうかをユーザーに確認してもらって、AndroidマーケットのQRコードスキャナーのページに遷移。

    @Override
    public void onClick(DialogInterface dialog, int which) {
        if (which == DialogInterface.BUTTON_NEGATIVE) return;
        switch (dialogId) {
        case R.id.download_barcode_scanner:
            Uri uri = Uri.parse("market://details?id=com.google.zxing.client.android");
            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            startActivity(intent);
            break;
        default:
            // hogehoge
            break;
        }
    }

ここでユーザーがインストールしてくれればOK!
IS01とかIS03に最初から入ってるバーコードリーダーをIntent経由で使う方法ってどこかに落ちてないかなー。