Android+ZxingでQRコード操作、再び

Android開発の仕事にはついていないのですが、
仕事があまりにもひm…勉強兼ねて、
先輩にお題を出してもらってAndroidアプリを作ってました。
……同じこと6年前も言ったぞ?そのときもZxingだったぞ?

6年前とは使い方とかちょっと変わってるみたいなので、
自分用にメモを残しておきます。
今回はカメラのキャプチャのJAN-13とQRコードを読み取りたかったです。

/**
 * カメラプレビューのキャプチャ取得時のコールバック
 */
private Camera.PreviewCallback pictureListener = new Camera.PreviewCallback() {
    // データ生成完了
    public void onPreviewFrame(byte[] data, Camera camera) {
        try {
            if (data != null) {
                Camera.Size size = camera.getParameters().getPreviewSize();
                // Zxingは一次元バーコードを一方向しかサポートしていないため
                // 失敗した場合には90度回転して2度試す
                if (!DecodeAndSend(data, size, false)) {
                    DecodeAndSend(data, size, true);
                }
                // プレビューを再開する
                StartPreviewAndAutoFocus();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
};
/**
 * バーコード解析
 *
 * @param data    YUVのByte配列
 * @param size    カメラサイズ
 * @param bIsRoll 90度回転するか
 * @return 送信まで完了していればtrue
 */
private boolean DecodeAndSend(byte[] data, Camera.Size size, boolean bIsRoll) {
    boolean ret = false;
    Result result = null;
    try {
        BinaryBitmap binaryBmp = null;
        if (bIsRoll) {
            // YUVをBitmap化
            YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21,
                    size.width, size.height, null);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            yuvimage.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, baos);
            byte[] jdata = baos.toByteArray();
            BitmapFactory.Options bitmapFatoryOptions = new BitmapFactory.Options();
            bitmapFatoryOptions.inPreferredConfig = Bitmap.Config.RGB_565;
            Bitmap bitmap = BitmapFactory.decodeByteArray(jdata, 0, jdata.length, bitmapFatoryOptions);
            // Bitmapを90度回転
            Matrix mat = new Matrix();
            mat.postRotate(90);
            Bitmap bmp = Bitmap.createBitmap(bitmap, 0, 0, size.width, size.height, mat, true);
            int width = bmp.getWidth();
            int height = bmp.getHeight();
            int[] pixels = new int[width * height];
            bmp.getPixels(pixels, 0, width, 0, 0, width, height);
            RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
            binaryBmp = new BinaryBitmap(new HybridBinarizer(source));
        } else {
            PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(
                    data, size.width, size.height, 0, 0, size.width, size.height, false);
            binaryBmp = new BinaryBitmap(new HybridBinarizer(source));
        }
        Reader reader = new MultiFormatReader();
        Log.d("decode Success : ", reader.decode(binaryBmp).getText());
        ret = true;
    } catch (NotFoundException eNotFound) {
        // バーコードが見つからない
    } catch (Exception e) {
        e.printStackTrace();
    }
    return ret;
}

実際はLog.dのところでシャッター音鳴らしたり、読取り結果を暗号化したり、Bluetooth通信したりしてますが、今回はあくまでZxingのとこだけ。


他にもニッチなIT関連要素をまとめていますので、よければ一覧記事もご覧ください。

1件のコメント

返信を残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)