Android裝置怎麼擷取掃碼槍掃描內容

來源:互聯網
上載者:User

標籤:rod   固定   putc   android   std   解析   sed   space   config   

1. 藍芽配對,串連裝置

開啟系統設定,找到藍芽,開啟掃碼槍,配對掃碼槍裝置。輸入一個固定的配對碼,一般掃碼槍說明書裡都有寫。配對完成後,顯示裝置已串連。就ok。

2.AndroidManifest中配置許可權

android項目中的AndroidManifest.xml檔案添加藍芽許可權。

    <uses-permission     android:name="android.permission.BLUETOOTH" />    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
3.檢測掃碼槍的串連狀態

通常來說,掃碼槍裝置也相當於普通外接輸入裝置類型,外接鍵盤。

我這款掃碼槍裝置返回的是如下藍芽類型。

BluetoothClass.Device.Major.PERIPHERAL

一般而言,通過如下這種方式就可以獲得到我們掃碼槍裝置的資訊。

Set<BluetoothDevice> blueDevices = mBluetoothAdapter.getBondedDevices();if (blueDevices == null || blueDevices.size() <= 0) {    return false;}for (Iterator<BluetoothDevice> iterator = blueDevices.iterator(); iterator.hasNext(); ) {    BluetoothDevice bluetoothDevice = iterator.next();    if (bluetoothDevice.getBluetoothClass().getMajorDeviceClass() == BluetoothClass.Device.Major.PERIPHERAL) {        //TODO 擷取掃碼槍裝置資訊    }}

 

開發過程中,必然會需要即時判斷裝置是否正常串連。

mBluetoothAdapter.getBondedDevices()

這個方法僅僅只能夠判斷裝置是否已配對綁定。但是綁定不代表串連,所以只能放棄。

public List getConnectedDevices (int profile)
public int getConnectionState (BluetoothDevice device, int profile)

接著又嘗試了這兩個方法,方法是可用,但是必須要求裝置sdk>18,即android 4.3版本以上才可用。

後來轉頭一想,既然掃碼槍也是輸入裝置,我們可以不同藍牙裝置狀態檢測入手,改為從輸入裝置檢測入手。於是,

private void hasScanGun() {    Configuration cfg = getResources().getConfiguration();    return cfg.keyboard != Configuration.KEYBOARD_NOKEYS;}

搞定。

4.擷取掃碼槍掃描內容

掃描槍,既然是一個外接輸入裝置,那麼很自然的,我們就從KeyEvent入手。

事件解析類

/** * 掃碼槍事件解析類 */public class ScanGunKeyEventHelper {    //延遲500ms,判斷掃碼是否完成。    private final static long MESSAGE_DELAY = 500;    //掃碼內容    private StringBuffer mStringBufferResult = new StringBuffer();    //大小寫區分    private boolean mCaps;    private OnScanSuccessListener mOnScanSuccessListener;    private Handler mHandler = new Handler();    private final Runnable mScanningFishedRunnable = new Runnable() {        @Override        public void run() {            performScanSuccess();        }    };    //返回掃描結果    private void performScanSuccess() {        String barcode = mStringBufferResult.toString();        if (mOnScanSuccessListener != null)            mOnScanSuccessListener.onScanSuccess(barcode);        mStringBufferResult.setLength(0);    }    //key事件處理    public void analysisKeyEvent(KeyEvent event) {        int keyCode = event.getKeyCode();        //字母大小寫判斷        checkLetterStatus(event);        if (event.getAction() == KeyEvent.ACTION_DOWN) {            char aChar = getInputCode(event);;            if (aChar != 0) {                mStringBufferResult.append(aChar);            }            if (keyCode == KeyEvent.KEYCODE_ENTER) {                //若為斷行符號鍵,直接返回                mHandler.removeCallbacks(mScanningFishedRunnable);                mHandler.post(mScanningFishedRunnable);            } else {                //延遲post,若500ms內,有其他事件                mHandler.removeCallbacks(mScanningFishedRunnable);                mHandler.postDelayed(mScanningFishedRunnable, MESSAGE_DELAY);            }        }    }    //檢查shift鍵    private void checkLetterStatus(KeyEvent event) {        int keyCode = event.getKeyCode();        if (keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT || keyCode == KeyEvent.KEYCODE_SHIFT_LEFT) {            if (event.getAction() == KeyEvent.ACTION_DOWN) {                //按著shift鍵,表示大寫                mCaps = true;            } else {                //鬆開shift鍵,表示小寫                mCaps = false;            }        }    }    //擷取掃描內容    private char getInputCode(KeyEvent event) {        int keyCode = event.getKeyCode();        char aChar;        if (keyCode >= KeyEvent.KEYCODE_A && keyCode <= KeyEvent.KEYCODE_Z) {            //字母            aChar = (char) ((mCaps ? ‘A‘ : ‘a‘) + keyCode - KeyEvent.KEYCODE_A);        } else if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) {            //數字            aChar = (char) (‘0‘ + keyCode - KeyEvent.KEYCODE_0);        } else {            //其他符號            switch (keyCode) {                case KeyEvent.KEYCODE_PERIOD:                    aChar = ‘.‘;                    break;                case KeyEvent.KEYCODE_MINUS:                    aChar = mCaps ? ‘_‘ : ‘-‘;                    break;                case KeyEvent.KEYCODE_SLASH:                    aChar = ‘/‘;                    break;                case KeyEvent.KEYCODE_BACKSLASH:                    aChar = mCaps ? ‘|‘ : ‘\\‘;                    break;                default:                    aChar = 0;                    break;            }        }        return aChar;    }    public interface OnScanSuccessListener {        public void onScanSuccess(String barcode);    }    public void setOnBarCodeCatchListener(OnScanSuccessListener onScanSuccessListener) {        mOnScanSuccessListener = onScanSuccessListener;    }    public void onDestroy() {        mHandler.removeCallbacks(mScanningFishedRunnable);        mOnScanSuccessListener = null;    }}

 

Activity中重寫dispatchKeyEvent方法,截取Key事件。

 /**     * Activity截獲按鍵事件.發給ScanGunKeyEventHelper     *     * @param event     * @return     */    @Override    public boolean dispatchKeyEvent(KeyEvent event) {        if (isScanGunEvent(event)) {             mScanGunKeyEventHelper.analysisKeyEvent(event);            return true;        }        return super.dispatchKeyEvent(event);    }    /**     * 顯示掃描內容     * @param barcode 條碼     */    @Override    public void onScanSuccess(String barcode) {        //TODO 顯示掃描內容    }

 

詳細代碼參看:https://github.com/czhzero/scangon

注意點:

1.部分機型無法判斷外接鍵盤資訊,如三星。

private void hasScanGun() {    Configuration cfg = getResources().getConfiguration();    return cfg.keyboard != Configuration.KEYBOARD_NOKEYS;}

 

三星手機cfg.keyboard傳回值等於Configuration.KEYBOARD_NOKEYS。

因此為了更好的相容,可以採用如下方法,

/** * 判斷是否已經串連掃碼槍 * @return */protected boolean hasScanGun() {    Set<BluetoothDevice> blueDevices = mBluetoothAdapter.getBondedDevices();    if (blueDevices == null || blueDevices.size() <= 0) {        return false;    }    for (Iterator<BluetoothDevice> iterator = blueDevices.iterator(); iterator.hasNext(); ) {        BluetoothDevice bluetoothDevice = iterator.next();        if (bluetoothDevice.getBluetoothClass().getMajorDeviceClass() == BluetoothClass.Device.Major.PERIPHERAL) {            return isInputDeviceUsed(bluetoothDevice.getName());        }    }    return false;}private boolean isInputDeviceUsed(String deviceName) {    int[] deviceIds = InputDevice.getDeviceIds();    for (int id : deviceIds) {        if (InputDevice.getDevice(id).getName().equals(deviceName)) {            return true;        }    }    return false;}

如果你正在尋找一款可用於二次開發的掃描槍請聯絡我們,我們提供完整的SDK包下載:

 

Android裝置怎麼擷取掃碼槍掃描內容

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.