Androidアプリでバーコードリーダーから値を受け取る

先日、Android タブレットにUSBでバーコードリーダーを繋いでアプリで読み取る実装を経験しました。基本的にUSB接続のバーコードリーダーはキーボードと同じです。読み取った文字列のキーコードを1文字ずつ送りつけてエンターで終わります。

Android アプリでは setOnKeyListener の onKey でキーイベントを拾って1文字ずつ処理します。プログラムの流れとしては、ループで1文字ずつ繋げてエンターキーを受け取ったら繋げた文字列を処理用の関数に渡す、となっています。コードはこんな感じです。

    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = binding.getRoot();
        rootView.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View view, int i, KeyEvent keyEvent) {
                if (keyEvent.getAction() != KeyEvent.ACTION_UP) { // キーが押されたときが ACTION_DOWN, 離されたときが ACTION_UP
                    return false;
                }
                int keyCode = keyEvent.getKeyCode();
                if (keyCode == KeyEvent.KEYCODE_ENTER) {  // エンターキーが押されたら終了。ここまで繋げてきた数字の列を処理する。
                    processValue(scannedDigits); 
                    scannedDigits = "";
                    return false;
                } else if (keyCode < KeyEvent.KEYCODE_0 || KeyEvent.KEYCODE_9 < keyCode) { // 数字以外の文字は無視する
                    return false;
                }
                scannedDigits += (char) (keyCode + 41); // ASCII コードに変換
                return false;
            }
        });

        return rootView;
    }

上記は数値をバーコード化したものを読み取る処理です。 KeyEvent.KEYCODE_0とKeyEvent.KEYCODE_9でキーコードの範囲を限定しています。

最初はバーコードリーダーという自分にとっての未知のデバイスを前に身構えていたものの、PCに接続して読み取った文字列をエディタに反映させたりブラウザのフォームを埋めたりしているうちにキーボードと同じという実感を得ていく作業は大変楽しいものでした。

Related Post