python读取usb扫码枪数据_USB
Android使用AccessibilityService實現(xiàn)USB掃碼槍數(shù)據(jù)抓取
android單屏機,通過掃碼槍掃描二維碼的場景非常多,掃碼槍的種類也有藍牙、USB、串口等等
目前USB的掃碼槍主流的就是以下兩種
1、USB HID-KBW:掃碼器會將掃描出來的內(nèi)容轉(zhuǎn)化為鍵盤事件,就是Android中KeyEvent里面對應(yīng)的常量(KeyEvent.KEYCODE_*)。
2、USB虛擬串口:可使用連接到UsbDevice進行通信,讀取數(shù)據(jù)。(設(shè)備要支持串口)
支持Android熱插拔USB掃描槍會在有EditText時,掃描槍掃描內(nèi)容自動輸入到編輯框了,但是有很多輸入法兼容的問題,比如搜狗輸入法識別到HID設(shè)備時會隱藏無法彈出,如果輸入法切換成中文時會輸入中文等等。
通過串口的方式直接獲取原始數(shù)據(jù),不再跟輸入法產(chǎn)生沖突,可惜設(shè)備是USB HID的,通過大量的嘗試(包括USB虛擬串口)都不支持(對串口不了解的同學可以先看看這篇文章)
掃碼槍是基于鍵盤輸入的,嘗試從獲取焦點的Activity中的dispatchKeyEvent(KeyEvent event)進行攔截,可惜只能解決掉中文的問題,事件還是先走到輸入法才能回到Activity。于是強大的AccessibilityService就上場了,使用AccessibilityService可以優(yōu)先獲取到鍵盤事件。
使用強大的AccessibilityService(Google為了讓Android系統(tǒng)更實用,為用戶提供了無障礙輔助服務(wù)),但需要到系統(tǒng)設(shè)置->無障礙->服務(wù)開啟當前服務(wù)。對AccessibilityService不了解的同學看看
廢話不多說看實現(xiàn)步驟
1、先創(chuàng)建掃碼Service直接繼承AccessibilityService就OK
public class ScanService extends AccessibilityService{
private staticOnKeyEvent onKeyEvent;
@Override
public int onStartCommand(Intent intent,intflags,intstartId) {
returnSTART_STICKY;
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
}
@Override
public void onInterrupt() {
}
@Override
protected boolean onKeyEvent(KeyEvent event) {
if(onKeyEvent!=null){
//這里通過回調(diào)的方式將事件傳出去統(tǒng)一處理
//返回true事件就會攔截不會繼續(xù)傳遞
returnonKeyEvent.onKeyEvent(event);
}
return super.onKeyEvent(event);
}
/**
*設(shè)置監(jiān)聽
*@paramonKeyEvent
*/
public static void setOnKeyEvent(OnKeyEvent onKeyEvent){
ScanService.onKeyEvent=onKeyEvent;
}
public interface OnKeyEvent{
boolean onKeyEvent(KeyEvent event);
}
}
2、創(chuàng)建好自己的ScanService后需要在manifest中進行注冊
android:name="包名.service.ScanService"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
android:name="android.accessibilityservice"
android:resource="@xml/accessibility"
/>
創(chuàng)建android:resource需要用到的xml,在res下新建xml文件夾,新建accessibility.xml
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagRequestFilterKeyEvents"
android:canRetrieveWindowContent="true"
android:notificationTimeout="100"
android:canRequestFilterKeyEvents="true"
android:description="@string/accessibility_description"
android:packageNames="包名"/>
android:description指定一個String作為描述文案
這里是描述輔助功能的文案
到此為止AccessibilityService就配置好了,你的應(yīng)用就會出現(xiàn)在系統(tǒng)設(shè)置->輔助功能列表里,只需要手動在設(shè)置中打開輔助功能,掃碼槍的鍵盤事件就會觸發(fā)ScanService的onKeyEvent
接下來是對事件的處理1、過濾非掃碼槍的設(shè)備
/**
*檢測輸入設(shè)備是否是掃碼器
*
*@paramcontext
*@return 是的話返回true,否則返回false
*/
public boolean isInputFromScanner(Context context, KeyEvent event) {
if(event.getDevice() ==null) {
return false;
}
//??????? event.getDevice().getControllerNumber();
if(event.getKeyCode() == KeyEvent.KEYCODE_BACK || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP) {
//實體按鍵,若按鍵為返回、音量加減、返回false
return false;
}
if(event.getDevice().getSources() == (InputDevice.SOURCE_KEYBOARD | InputDevice.SOURCE_DPAD | InputDevice.SOURCE_CLASS_BUTTON)) {
//虛擬按鍵返回false
return false;
}
Configuration cfg = context.getResources().getConfiguration();
returncfg.keyboard != Configuration.KEYBOARD_UNDEFINED;
}
2、處理事件
Runnable mScanningFishedRunnable =newRunnable() {
@Override
public void run() {
String code = mStringBufferResult.toString();
//做相應(yīng)處理....
mStringBufferResult.setLength(0);
}
};
/**
*掃碼槍事件解析
*
*@paramevent
*/
public void analysisKeyEvent(KeyEvent event) {
intkeyCode = event.getKeyCode();
總結(jié)
以上是生活随笔為你收集整理的python读取usb扫码枪数据_USB的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 咕咕机怎么打印彩色的
- 下一篇: python基本统计量_Python中简