如何区分androidKeyEvent和外接设备KeyEvent

How to distinguish between android KeyEvent and external device KeyEvent

我正在使用通过 USB 连接到 android 设备的外部设备阅读 barcodes/cards。

外部设备将它的输入作为 KeyEvent 发送到 Activity,我可以在 Activity 内的 dispatchKeyEvent() 方法中读取它,就像这样

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

但是,例如,当关注某些 EditText 时,它会将外部设备输入输入到该输入字段,而不是仅仅委托给服务。

有没有办法区分来​​自 android 设备(软键盘)和来自外部设备(RFID 卡 reader 或条码扫描仪)的输入?

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

如有任何见解,我们将不胜感激。

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

@编辑 另一种方法是从 UsbManager 获取 USB 连接设备列表。使用该列表来确定 KeyEvent 父级是否在该列表内以进行区分。需要注意的是,如果您连接硬件键盘,它会将 KeyEvents 视为来自 Barcode/RFID card Scanner