Android 外接USB扫码器
Android外接USB扫码枪 https://www.jianshu.com/p/5c1bf3e968e6
USB扫码器实质就是一个外接键盘
客户问题:同一个二维码来扫描,一个视频是在谷歌输入法下测试的,每一次都有不同,另外一个视频是在原生输入法下测试的,没有什么误差
USB扫码器 在使用 GooglePinYin 输入法 打印数据 时会出现 少字符多换行字符等,
是因为输入法键盘符号、数字差异问题。
a.如果demo中用的 建议 自定义拦截键盘事件 不弹出输入法键盘
b.可以更新固件 这边找到合适的输入法了 要更新固件请提出需求
一.ScanKeyManager的拦截键盘事件并将它转化成需要的数据的管理类
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中使用
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); } }