【问题标题】:android differentiate between bluetooth hard keyboard and barcode scanner on key eventandroid在关键事件上区分蓝牙硬键盘和条形码扫描仪
【发布时间】:2018-11-09 21:15:07
【问题描述】:

所以我有以下代码可以区分软键盘输入和蓝牙条码扫描器...

               if(event.getAction()==KeyEvent.ACTION_DOWN){
                    if(event.getDeviceId()==-1) //from soft keyboard
                        return super.dispatchKeyEvent(event);

                    char pressedKey = (char) event.getUnicodeChar();
                    barCode += pressedKey;
                }
                if (event.getAction()==KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
                    if(event.getDeviceId()==-1) //from keyboard
                        return super.dispatchKeyEvent(event);

                    String giftCardUPC = barCode.replaceAll("[^\\d.]", "");
                    fragmentProShopGiftCard.etUPCCode.setText(giftCardUPC);
                    barCode="";
                }

这个想法是条码扫描器有一个设备 ID,而软键盘没有。现在的问题是我有一个支持硬蓝牙键盘、软键盘(如果他们不使用硬键盘)以及条形码扫描仪的活动。

有什么方法可以区分 dispatchKeyEvent 上的 2 个硬件设备吗?

【问题讨论】:

  • 一个老生常谈的问题出现了:为什么?
  • 这是一个 POS 系统,并且有一项活动可以“敲响”礼品卡以出售给客户。用户需要扫描新的礼品卡以获取 UPC 码,还有一个硬键盘,用户可以输入客户姓名和其他信息。当商店忙碌时,软键盘太慢了。
  • 所以基本上你是在尝试审计效率?
  • 我正在努力满足客户的业务需求。
  • 你能告诉我们具体的要求是什么吗?这是防止手动输入礼品卡代码的安全措施,还是只是一种自动化/过滤输入的方法?如果是后者,可能有更好的方法来满足要求。

标签: android


【解决方案1】:

这就是我最终要做的...我注意到条形码扫描仪的第一个条目始终是 KEYCODE_LEFT_SHIFT 的 KeyCode....

String barCode = "";
boolean barCodeMode = false;
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
                if(event.getAction()==KeyEvent.ACTION_DOWN){
                    if(event.getDeviceId()==-1) { //from soft keyboard
                        return super.dispatchKeyEvent(event);
                    }else if(event.getKeyCode() == KeyEvent.KEYCODE_SHIFT_LEFT || barCodeMode){ //from barcode scanner
                        barCodeMode = true;
                        char pressedKey = (char) event.getUnicodeChar();
                        barCode += pressedKey;
                    }else{ //from hard keyboard
                        return super.dispatchKeyEvent(event);
                    }
                }
                if (event.getAction()==KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
                    if(event.getDeviceId()==-1) { //from soft keyboard
                        return super.dispatchKeyEvent(event);
                    }else if(barCodeMode){ //from barcode scanner
                        String giftCardUPC = barCode.replaceAll("[^\\d.]", "");
                        fragmentProShopGiftCard.etUPCCode.setText(giftCardUPC);
                        barCode="";
                        barCodeMode = false;
                    }else{ //from hard keyboard
                        return super.dispatchKeyEvent(event);
                    }
                }

            }

【讨论】:

    【解决方案2】:

    如果 Activity(或之前的 Activity 或 Fragment)中有其他字段需要用户手动输入,您可以在其中检查并保存设备 ID,然后将其与用于您感兴趣的输入。

    另一种可能性是记录关键事件的时间。条码阅读器的速度比任何人都可以打字快得多。

    【讨论】:

    • 设备 ID 是否会更改?例如,如果设备的电池电量耗尽,是否会为其分配一个新的设备 ID?我应该将设备 ID 保存在共享首选项中的什么位置?
    • getDeviceId 的 Android 文档说“其他数字是任意的,你不应该依赖这些值。”我只是猜测,但每次重新连接、关闭和打开设备或重新启动主机(您的 POS)时,ID 可能会发生变化。
    • 天哪,你会认为有办法获取mac地址或这些设备的某些东西,以便你识别它们
    • @TKK 如果我走计时路线,我只是在按键和按键之间计时吗?
    • @Jarrette 我在连续按键之间思考。
    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    相关资源
    最近更新 更多