Android 外接USB扫码器
Android外接USB扫码枪 https://www.jianshu.com/p/5c1bf3e968e6
USB扫码器实质就是一个外接键盘
客户问题:同一个二维码来扫描,一个视频是在谷歌输入法下测试的,每一次都有不同,另外一个视频是在原生输入法下测试的,没有什么误差
USB扫码器 在使用 GooglePinYin 输入法 打印数据 时会出现 少字符多换行字符等,
是因为输入法键盘符号、数字差异问题。
a.如果demo中用的 建议 自定义拦截键盘事件 不弹出输入法键盘
b.可以更新固件 这边找到合适的输入法了 要更新固件请提出需求
一.ScanKeyManager的拦截键盘事件并将它转化成需要的数据的管理类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | package com.gatsby.barcodescanner; import android.view.KeyEvent; public class ScanKeyManager { private StringBuilder mResult; public OnScanValueListener mListener; private boolean mCaps; public interface OnScanValueListener { void onScanValue(String value); } public ScanKeyManager(OnScanValueListener listener) { this .mListener = listener; this .mResult = new StringBuilder(); } /** * 扫码设备事件解析 */ public void analysisKeyEvent(KeyEvent event) { int keyCode = event.getKeyCode(); checkLetterStatus(event); if (event.getAction() == KeyEvent.ACTION_DOWN) { char aChar = getInputCode(mCaps, event.getKeyCode()); if (aChar != 0 ) { mResult.append(aChar); } if (keyCode == KeyEvent.KEYCODE_ENTER) { if (mListener != null ) { mListener.onScanValue(mResult.toString()); } mResult.delete( 0 , mResult.length()); } } } /** * 判断大小写 */ private void checkLetterStatus(KeyEvent event) { int keyCode = event.getKeyCode(); if (keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT || keyCode == KeyEvent.KEYCODE_SHIFT_LEFT) { mCaps = event.getAction() == KeyEvent.ACTION_DOWN; } } /** * 将keyCode转为char * * @param caps 是不是大写 * @param keyCode 按键 * @return 按键对应的char */ private char getInputCode( boolean caps, int keyCode) { if (keyCode >= KeyEvent.KEYCODE_A && keyCode <= KeyEvent.KEYCODE_Z) { return ( char ) ((caps ? 'A' : 'a' ) + keyCode - KeyEvent.KEYCODE_A); } else { return keyValue(caps, keyCode); } } /** * 按键对应的char表 */ private char keyValue( boolean caps, int keyCode) { switch (keyCode) { case KeyEvent.KEYCODE_0: return caps ? ')' : '0' ; case KeyEvent.KEYCODE_1: return caps ? '!' : '1' ; case KeyEvent.KEYCODE_2: return caps ? '@' : '2' ; case KeyEvent.KEYCODE_3: return caps ? '#' : '3' ; case KeyEvent.KEYCODE_4: return caps ? '$' : '4' ; case KeyEvent.KEYCODE_5: return caps ? '%' : '5' ; case KeyEvent.KEYCODE_6: return caps ? '^' : '6' ; case KeyEvent.KEYCODE_7: return caps ? '&' : '7' ; case KeyEvent.KEYCODE_8: return caps ? '*' : '8' ; case KeyEvent.KEYCODE_9: return caps ? '(' : '9' ; case KeyEvent.KEYCODE_NUMPAD_SUBTRACT: return '-' ; case KeyEvent.KEYCODE_MINUS: return '_' ; case KeyEvent.KEYCODE_EQUALS: return '=' ; case KeyEvent.KEYCODE_NUMPAD_ADD: return '+' ; case KeyEvent.KEYCODE_GRAVE: return caps ? '~' : '`' ; case KeyEvent.KEYCODE_BACKSLASH: return caps ? '|' : '\\' ; case KeyEvent.KEYCODE_LEFT_BRACKET: return caps ? '{' : '[' ; case KeyEvent.KEYCODE_RIGHT_BRACKET: return caps ? '}' : ']' ; case KeyEvent.KEYCODE_SEMICOLON: return caps ? ':' : ';' ; case KeyEvent.KEYCODE_APOSTROPHE: return caps ? '"' : '\'' ; case KeyEvent.KEYCODE_COMMA: return caps ? '<' : ',' ; case KeyEvent.KEYCODE_PERIOD: return caps ? '>' : '.' ; case KeyEvent.KEYCODE_SLASH: return caps ? '?' : '/' ; default : return 0 ; } } } |
二.在activity中使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package com.gatsby.barcodescanner; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private ScanKeyManager scanKeyManager; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); //拦截扫码器回调,获取扫码内容 scanKeyManager = new ScanKeyManager( new ScanKeyManager.OnScanValueListener() { @Override public void onScanValue(String value) { Log.d( "gatsby" , "ScanValue->" +value); } }); } /*监听键盘事件,除了返回事件都将它拦截,使用我们自定义的拦截器处理该事件*/ @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() != KeyEvent.KEYCODE_BACK) { scanKeyManager.analysisKeyEvent(event); return true ; } return super .dispatchKeyEvent(event); } } |
分类:
RockChip
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】