多个扫码枪区分

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扫描枪前后缀设置
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值