如何区分android KeyEvent和外部设备KeyEvent

时间:2018-04-16 17:19:57

标签: android barcode-scanner keyevent

我正在阅读带有通过USB连接到Android设备的外部设备的条形码/卡片。

外部设备将其输入作为KeyEvent发送给Activity,我可以在dispatchKeyEvent()内的Activity方法中将其读取为

@Override public boolean dispatchKeyEvent(KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
        externalDeviceService.onNewInputFromExternalDevice(((char) event.getUnicodeChar()));
    }
    return super.dispatchKeyEvent(event);
}

但是,例如当焦点集中在某些EditText时,它会将外部设备输入键入该输入字段,而不是仅委托给服务。

有没有办法区分Android设备(软键盘)和外部设备(RFID读卡器或条形码扫描仪)的输入?

明显的解决方案是keyEvent.getDevice().getName(),并且能够识别外部设备以适当地处理事件,但这会将我绑定到特定设备,这是一个巨大的限制。也许有办法检查KeyEvent是否来自android软键盘?

对此有任何见解将不胜感激。

1 个答案:

答案 0 :(得分:1)

对于对未来感兴趣的任何人,我将KeyEvents从dispatchKeyEvent()发送到某些外部服务,如果下一个字符出现在之前的指定时间内,则表示它来自scanner / rfid。在其他情况下,我将KeyEvent发送回Activity并调用super.dispatchKeyEvent()

@Edit 另一种方法是从UsbManager获取USB连接设备列表。使用该列表确定KeyEvent parent是否在该列表中以进行区分。需要注意的是,如果您连接硬件键盘,它会处理KeyEvents,因为它来自条形码/ RFID卡扫描仪