Android接收蓝牙/USB条码扫描器扫码结果的代码段有效性问询
只有标记1的逻辑可以正常获取扫码结果,标记2、3的实现均不可用,同时现有代码还存在逻辑错误需要修正,各部分详细说明如下:
- 标记1部分:逻辑可用。绝大多数即插即用条码扫描器都是HID输入设备,会模拟键盘逐个发送条码对应的按键事件,每次KeyEvent对应单个字符,调用
getUnicodeChar()可以正确拿到当前按键对应的字符。你需要补充两个逻辑:一是只处理KeyEvent.ACTION_DOWN类型的事件,避免按键抬起事件触发重复添加字符;二是要把每次收到的字符拼接缓存,直到收到扫描器默认输出的结束符(通常是回车键,对应KeyEvent.KEYCODE_ENTER),就可以拿到完整的条码内容。 - 标记2部分:无法拿到结果。
KeyEvent.getCharacters()方法仅用于输入法一次性提交多个组合字符的场景(比如拼音联想输入、多字节字符输入),HID设备模拟的单次按键事件调用该方法只会返回null,因此无法获取到扫码字符。 - 标记3部分:不仅拿不到结果,所在的判断分支永远不会触发。你写的
event.getAction() == EditorInfo.IME_ACTION_DONE判断逻辑完全错误:event.getAction()的返回值是KeyEvent.ACTION_DOWN/KeyEvent.ACTION_UP这类按键动作常量,和EditorInfo里的输入法动作常量完全不属于同一个体系,这个条件永远为假,所以3的代码永远不会执行;退一步说就算分支能走到,getCharacters()同样会返回空值,拿不到结果。
你可以参考下面修正后的实现:
@Override public boolean dispatchKeyEvent(KeyEvent event) { if (viewModel.onTriggerScan()) { // 只处理按键按下事件,避免重复录入字符 if (event.getAction() == KeyEvent.ACTION_DOWN) { int keyCode = event.getKeyCode(); // 扫描器默认会发送回车键作为扫码结束标识 if (keyCode == KeyEvent.KEYCODE_ENTER) { viewModel.gotAllChars(); return true; } // 读取当前按键字符加入缓存 char pressedKey = (char) event.getUnicodeChar(); viewModel.addCharToCode(pressedKey); } return true; } return super.dispatchKeyEvent(event); }
内容的提问来源于stack exchange,提问作者Monsef Khalfaoui
相关产品推荐
相关产品推荐

