tag*_*mer 1 java android bluetooth hid barcode-scanner
我在 HID 模式下通过蓝牙将外部条码扫描仪连接到我的平板电脑,并尝试处理我的应用程序中的输入。条码扫描器基本上像键盘一样工作。
我有一个简单的 gui,在我的主要活动中,我有以下方法:
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
System.out.println(keyCode + " - " + (char) event.getUnicodeChar());
return true;
}
Run Code Online (Sandbox Code Playgroud)
问题:
当我打开一个文本应用程序,比如谷歌笔记并扫描任何代码时,条形码被插入,然后是一个新行。这让我觉得我可以处理关键事件并将所有字符写入字符串构建器,直到我到达“Enter”的关键事件。
但问题是,当我在我的应用程序中使用扫描仪(此条形码)时,上述方法的输出如下:
59 - ?? <- 'Shift'
29 -
59 - ??
47 - s
62 -
8 - 1
9 - 2
10 - 3
事件中无法捕获条形码末尾的“Enter”(应该是 keyCode 66),但我的 GUI 中的元素之一被突出显示,这意味着扫描仪必须发送“Enter”
当我将多行 EditText 添加到我的 GUI 并在元素聚焦时扫描相同的条形码时,输出如下:
29 - a
47 - s
62 -
8 - 1
9 - 2
10 - 3
66 -
这里记录了 'Enter' 键事件,而两个 'Shift' 键都不可见(但 EditText 元素中的字母是大写的)。
作为一种解决方法,我可以拥有一个始终保持聚焦的隐形多行元素,但我真的不希望依赖隐形元素。相反,我想捕捉我的条形码扫描仪发送的所有按键。
为什么我看不到“输入”的任何想法?
我对这个问题做了更多的研究,我找到了一个很好的(对我来说)令人满意的解决我的问题的方法。
显然 onKeyDown 和 onKeyUp 并不总是被调用,特别是如果一个 KeyEvent 在其他地方被 window 元素消耗。在我的例子中,ListView 具有默认焦点并在到达提到的方法之前消耗了 ENTER 事件(因此它在我的问题描述中被突出显示)。
还有另一种方法可以使用,它在 KeyEvents 被发送到窗口之前被调用。它是 dispatchKeyEvent。但谨慎起见,该事件被调用两次,一次是按下键,一次是按下键。
这里是一个示例代码:
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
System.out.println(event.getAction() + " " + event.getKeyCode() + " - " + (char) event.getUnicodeChar());
return true;
}
Run Code Online (Sandbox Code Playgroud)
这个解决方案对我有用,因为我的应用程序不需要监听任何其他关键事件,否则应该使用另一个返回。
| 归档时间: |
|
| 查看次数: |
2616 次 |
| 最近记录: |