バーコードリーダー値取得

Androidアプリにて、端末付属バーコードスキャナーまたは、Bluetooth(HID)にて接続した外部スキャナーにてバーコード(QR等)を読み、特定のEditTextに値を反映⇒読込後アクション実行する必要があった為、簡易な方法を掲載します。

  • バーコードリーダー値の取得&アクション実行
/**
 * 初期起動時
 */
@Override
protected void onCreate(Bundle savedInstanceState) {

    // バーコード値取得用EditTextの変更リスナーイベントを設定
    EditText etBarCode = (EditText) findViewById(R.id.etBarCode);
    etBarCode.setFocusable(true);
    etBarCode.addTextChangedListener( new TextWatcher() {

        private int beforeCount = 0;
        private int afterCount = 0;

        // EditTextの文字列に変更がある場合にコール
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            afterCount = count;
        }

        // EditTextの文字列に変更がある場合に変更前にコール
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            beforeCount = count;
        }

        // EditTextの文字列に変更がある場合に変更後にコール
        @Override
        public void afterTextChanged(Editable s) {

            // 変更された文字列の差異が2バイト以上の場合は、ペーストまたはバーコードスキャン対象とする。
            if (s.toString().trim().length()>0 && (afterCount-beforeCount)>1) {

                // バーコード値スキャンとして処理を自動呼出しする。
                ImageView ivBarCodeBtn = (ImageView) findViewById(R.id.ivBarCodeBtn);
                eventCall(ivBarCodeBtn);
            }
        }
    } );

    // EditTextにリスナーをセット
    etBarCode.setOnKeyListener(new OnKeyListener() {

        //コールバックとしてonKey()メソッドを定義
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {

            //イベントを取得するタイミングには、ボタンが押されてなおかつエンターキーだったときを指定
            if((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)){

                //キーボードを閉じる
                inputMethodManager =  (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                inputMethodManager.hideSoftInputFromWindow(etBarCode.getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);

                String strBarCodeData = etBarCode.getText().toString();

                if (strBarCodeData.toString().trim().length()>0) {

                    // バーコード値スキャンとして処理を手動(Enter)呼出しする。
                    ImageView ivBarCodeBtn = (ImageView) findViewById(R.id.ivBarCodeBtn);
                    eventCall(ivBarCodeBtn);
                }
                return true;
            }

            return false;
        }
    });

    // バーコードにフォーカス時(値をクリアする)
    etBarCode.setOnFocusChangeListener(new View.OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {

            if(hasFocus){
                //フォーカス時
                etBarCode.setText("");
            }
        }
    });
}

/**
 * 呼出し処理
 */
public void eventCall(View v) {

    if (v.getId() == R.id.ivBarCodeBtn) {

        // バーコードスキャンまたはボタン押下時

        // バーコード値を取得する。
        EditText etBarCode = (EditText) findViewById(R.id.etBarCode);
        String strBarCodeData = etBarCode.getText().toString();
    }
}

基本的にバーコードリーダーはHID方式であれば 、フォーカスがあるEditTextにキーボード入力されたのと同等に値が自動入力されますので、その変化をイベントで取得し、スキャン後に自動的に処理させたい場合は、その変化があった場合にコールしているだけです。変化時の判定で2バイト以上としているのは、対象のEditTextは入力もできるテキストで作っており、入力後任意の桁数で実行ボタンを押下していた為、手動入力の1バイトずつ入力する場合に自動処理されないようにした為です。※バーコードリーダーのスキャン値はまとめて編集され、イベントが発生する。