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); } }