强行挺进警花紧窄娇嫩小说_亚洲综合在线中文字幕_日韩免费福利影院_日本在线精品视频_国产自产2019最新国偷_午夜福利日韩精品_91美女软件电影观看_欧美成人高清一区二区三区_久久精品被窝影院午夜无码国产_亚洲丰满少妇中文字幕

Android 實現(xiàn)USB掃碼數(shù)據(jù)抓取(三個參考方法)

日期:2019-07-29 分類:微信刷臉開發(fā)SDK資料 下載:14560 瀏覽:30012

點擊下載

更多附件:
點擊下載 點擊下載

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

 

android單屏機,通過掃碼槍掃描二維碼的場景非常多,掃碼槍的種類也有藍牙、USB、串口等等

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

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

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

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

通過串口的方式直接獲取原始數(shù)據(jù),不再跟輸入法產(chǎn)生沖突,可惜設(shè)備是USB HID的,通過大量的嘗試(包括USB虛擬串口)都不支持(對串口不了解的同學(xué)可以先看看這篇文章上半年最好的Android串口開發(fā)入門指南 - 簡書 

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

使用強大的AccessibilityServiceGoogle為了讓Android系統(tǒng)更實用,為用戶提供了無障礙輔助服務(wù)),但需要到系統(tǒng)設(shè)置->無障礙->服務(wù) 開啟當(dāng)前服務(wù)。對AccessibilityService不了解的同學(xué)看看http://www.jianshu.com/p/4cd8c109cdfb

廢話不多說看實現(xiàn)步驟

1、先創(chuàng)建掃碼Service直接繼承AccessibilityServiceOK

public class ScanService extends AccessibilityService {

    private static OnKeyEvent onKeyEvent;

    @Override

    public int onStartCommand(Intent intent, int flags, int startId) {

        return START_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ù)傳遞

           return onKeyEvent.onKeyEvent(event);

        }

        return super.onKeyEvent(event);

    }

    /**

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

     * @param onKeyEvent

     */

    public static void setOnKeyEvent(OnKeyEvent onKeyEvent){

        ScanService.onKeyEvent=onKeyEvent;

    }

    public interface OnKeyEvent{

        boolean onKeyEvent(KeyEvent event);

    }

}

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

 <service

            android:name="包名.service.ScanService"

            android:enabled="true"

            android:exported="true"

            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">

            <intent-filter>

                <action android:name="android.accessibilityservice.AccessibilityService"/>

            </intent-filter>

            <meta-data

                android:name="android.accessibilityservice"

                android:resource="@xml/accessibility"

                />

</service>

創(chuàng)建android:resource需要用到的xml ,在res下新建xml文件夾,新建accessibility.xml

<?xml version="1.0" encoding="utf-8"?>

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"

    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作為描述文案

<string name="accessibility_description">這里是描述輔助功能的文案</string>

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

接下來是對事件的處理
1
、過濾非掃碼槍的設(shè)備

  /**

     * 檢測輸入設(shè)備是否是掃碼器

     *

     * @param context

     * @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();

        return cfg.keyboard != Configuration.KEYBOARD_UNDEFINED;

    }

2、處理事件

Runnable mScanningFishedRunnable = new Runnable() {

            @Override

            public void run() {

                String code = mStringBufferResult.toString();

                //做相應(yīng)處理....

                mStringBufferResult.setLength(0);

            }

        };

/**

     * 掃碼槍事件解析

     *

     * @param event

     */

    public void analysisKeyEvent(KeyEvent event) {

 

        int keyCode = event.getKeyCode();

 


上一篇:對接收銀機雙工線 開發(fā)SDK

下一篇:安卓app實現(xiàn)laucher(啟動器功能)功能

0755 - 8336 8811
13632541019 18025353128