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