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バイトずつ入力する場合に自動処理されないようにした為です。※バーコードリーダーのスキャン値はまとめて編集され、イベントが発生する。