日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python读取usb扫码枪数据_USB

發(fā)布時(shí)間:2023/12/19 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python读取usb扫码枪数据_USB 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Android使用AccessibilityService實(shí)現(xiàn)USB掃碼槍數(shù)據(jù)抓取

android單屏機(jī),通過(guò)掃碼槍掃描二維碼的場(chǎng)景非常多,掃碼槍的種類也有藍(lán)牙、USB、串口等等

目前USB的掃碼槍主流的就是以下兩種

1、USB HID-KBW:掃碼器會(huì)將掃描出來(lái)的內(nèi)容轉(zhuǎn)化為鍵盤事件,就是Android中KeyEvent里面對(duì)應(yīng)的常量(KeyEvent.KEYCODE_*)。

2、USB虛擬串口:可使用連接到UsbDevice進(jìn)行通信,讀取數(shù)據(jù)。(設(shè)備要支持串口)

支持Android熱插拔USB掃描槍會(huì)在有EditText時(shí),掃描槍掃描內(nèi)容自動(dòng)輸入到編輯框了,但是有很多輸入法兼容的問(wèn)題,比如搜狗輸入法識(shí)別到HID設(shè)備時(shí)會(huì)隱藏?zé)o法彈出,如果輸入法切換成中文時(shí)會(huì)輸入中文等等。

通過(guò)串口的方式直接獲取原始數(shù)據(jù),不再跟輸入法產(chǎn)生沖突,可惜設(shè)備是USB HID的,通過(guò)大量的嘗試(包括USB虛擬串口)都不支持(對(duì)串口不了解的同學(xué)可以先看看這篇文章)

掃碼槍是基于鍵盤輸入的,嘗試從獲取焦點(diǎn)的Activity中的dispatchKeyEvent(KeyEvent event)進(jìn)行攔截,可惜只能解決掉中文的問(wèn)題,事件還是先走到輸入法才能回到Activity。于是強(qiáng)大的AccessibilityService就上場(chǎng)了,使用AccessibilityService可以優(yōu)先獲取到鍵盤事件。

使用強(qiáng)大的AccessibilityService(Google為了讓Android系統(tǒng)更實(shí)用,為用戶提供了無(wú)障礙輔助服務(wù)),但需要到系統(tǒng)設(shè)置->無(wú)障礙->服務(wù)開(kāi)啟當(dāng)前服務(wù)。對(duì)AccessibilityService不了解的同學(xué)看看

廢話不多說(shuō)看實(shí)現(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){

//這里通過(guò)回調(diào)的方式將事件傳出去統(tǒng)一處理

//返回true事件就會(huì)攔截不會(huì)繼續(xù)傳遞

returnonKeyEvent.onKeyEvent(event);

}

return super.onKeyEvent(event);

}

/**

*設(shè)置監(jiān)聽(tīng)

*@paramonKeyEvent

*/

public static void setOnKeyEvent(OnKeyEvent onKeyEvent){

ScanService.onKeyEvent=onKeyEvent;

}

public interface OnKeyEvent{

boolean onKeyEvent(KeyEvent event);

}

}

2、創(chuàng)建好自己的ScanService后需要在manifest中進(jìn)行注冊(cè)

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指定一個(gè)String作為描述文案

這里是描述輔助功能的文案

到此為止AccessibilityService就配置好了,你的應(yīng)用就會(huì)出現(xiàn)在系統(tǒng)設(shè)置->輔助功能列表里,只需要手動(dòng)在設(shè)置中打開(kāi)輔助功能,掃碼槍的鍵盤事件就會(huì)觸發(fā)ScanService的onKeyEvent

接下來(lái)是對(duì)事件的處理1、過(guò)濾非掃碼槍的設(shè)備

/**

*檢測(cè)輸入設(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) {

//實(shí)體按鍵,若按鍵為返回、音量加減、返回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的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。