我正在阅读带有通过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软键盘?
对此有任何见解将不胜感激。
答案 0 :(得分:1)
对于对未来感兴趣的任何人,我将KeyEvents从dispatchKeyEvent()
发送到某些外部服务,如果下一个字符出现在之前的指定时间内,则表示它来自scanner / rfid。在其他情况下,我将KeyEvent发送回Activity并调用super.dispatchKeyEvent()
@Edit
另一种方法是从UsbManager
获取USB连接设备列表。使用该列表确定KeyEvent parent是否在该列表中以进行区分。需要注意的是,如果您连接硬件键盘,它会处理KeyEvents,因为它来自条形码/ RFID卡扫描仪