1.逻辑分析:
1 android扫描枪将扫描结果转换为键盘输入;
2 查看KeyEvent,发现扫码输入与手动输入的区别,可通过deviceId判别;
3 扫描时deviceId不变,但插拔扫描枪时会变化,使得无法简单通过deviceId区别扫描枪;
4 多个扫描枪的区分,可以通过设置前缀区分;
5 多个扫描枪扫描时,可能导致数据混淆干涉,但这时又需要通过deviceId区分;
6 扫描到前缀时,获取deviceId,接下来相同deviceId输入来源于同一扫描枪;
7 拼接数据,扫描到后缀判断结束。
2.实例代码
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
//打印输入信息,可以查看扫码输入与手动输入的区别
//Log.d(TAG, "dispatchKeyEvent: "+event.toString());
if(event.getDeviceId()==-1) { //手动输入
return super.dispatchKeyEvent(event);
}
//ACTION_DOWN与ACTION_UP两者数据重复,只取其一,忽略ACTION_DOWN
//KEYCODE_SHIFT_LEFT:条码使用前缀时额外添加的数据
if(event.getAction() == KeyEvent.ACTION_DOWN || event.getKeyCode() == KEYCODE_SHIFT_LEFT ){
return true; //dispatcher结束
}
ScanInput scanInput = ScanInput.onScanInput(event);
if(scanInput != null){
Log.d(TAG, "dispatchKeyEvent: "+scanInput.toString());
//todo scanInput.getCodes();
}
return true;
}
public enum ScanInput {
//扫描枪在使用前需要设置好前后缀,通过前缀区分设备,后缀结束扫描;
//有左右两个扫描枪
left(KeyEvent.KEYCODE_A,KeyEvent.KEYCODE_ENTER),
right(KeyEvent.KEYCODE_B,KeyEvent.KEYCODE_ENTER);
private int id; //扫描枪id, 扫描到前缀时获取
private int prefix; //扫描枪前缀设置: KEYCODE_A , KEYCODE_B
private int suffix; //扫描枪后缀设置: KEYCODE_ENTER
private String codes="";
ScanInput(int prefix,int suffix){
this.prefix = prefix;
this.suffix = suffix;
}
public String getCodes() {
return this.codes;
}
private static ScanInput getScanInput(int id){
if(left.id == id) return left;
if(right.id == id) return right;
return null;
}
public static ScanInput onScanInput(KeyEvent event){
int id = event.getDeviceId();
int keyCode = event.getKeyCode();
//获取到前缀,本次扫描开始,清空上一次扫描数据,获取扫描枪设备id (id插拔扫码枪时会改变,实时获取)
switch (keyCode){
case KeyEvent.KEYCODE_A : left.id = id;left.code=""; return null;
case KeyEvent.KEYCODE_B : right.id =id;right.code="";return null;
}
//通过id获取哪一侧扫描
ScanInput scanInput = ScanInput.getScanInput(id);
if(scanInput!=null){
switch (keyCode){
//拼接输入字符,仅限数字可以输入,也可以添加其它字符
case KeyEvent.KEYCODE_0 : scanInput.codes+=0;break;
case KeyEvent.KEYCODE_1 : scanInput.codes+=1;break;
case KeyEvent.KEYCODE_2 : scanInput.codes+=2;break;
case KeyEvent.KEYCODE_3 : scanInput.codes+=3;break;
case KeyEvent.KEYCODE_4 : scanInput.codes+=4;break;
case KeyEvent.KEYCODE_5 : scanInput.codes+=5;break;
case KeyEvent.KEYCODE_6 : scanInput.codes+=6;break;
case KeyEvent.KEYCODE_7 : scanInput.codes+=7;break;
case KeyEvent.KEYCODE_8 : scanInput.codes+=8;break;
case KeyEvent.KEYCODE_9 : scanInput.codes+=9;break;
//获取到结束符,扫描结束,返回扫描对象
case KeyEvent.KEYCODE_ENTER : return scanInput;
default:break;
}
}
return null;
}
public String toString() {
return "ScanInput{" + "id=" + id + ", code=" + code + ", prefix=" + prefix + ", suffix=" + suffix + "}";
}
}
3.honeywell扫描枪前后缀设置