android商戶(hù)掃碼槍讀取手機(jī)二維碼
掃碼搶實(shí)現(xiàn)讀取二維碼信息,本地掃碼槍是外接寫(xiě)入設(shè)備,本質(zhì)是監(jiān)控讀寫(xiě)輸入,下面介紹下掃碼設(shè)備讀取支付二維碼。
1.引入掃碼設(shè)備輔助類(lèi)
public class ScanGunKeyEventHelper { private final static long MESSAGE_DELAY = 500; //延遲500ms,判斷掃碼是否完成。 private StringBuffer mStringBufferResult; //掃碼內(nèi)容 private boolean mCaps; //大小寫(xiě)區(qū)分 private final Handler mHandler; private final BluetoothAdapter mBluetoothAdapter; private final Runnable mScanningFishedRunnable; private OnScanSuccessListener mOnScanSuccessListener; private String mDeviceName; public ScanGunKeyEventHelper(OnScanSuccessListener onScanSuccessListener) { mOnScanSuccessListener = onScanSuccessListener ; mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); mStringBufferResult = new StringBuffer(); mHandler = new Handler(); mScanningFishedRunnable = new Runnable() { @Override public void run() { performScanSuccess(); } }; } /** * 返回掃碼成功后的結(jié)果 */ private void performScanSuccess() { String barcode = mStringBufferResult.toString(); if (mOnScanSuccessListener != null) mOnScanSuccessListener.onScanSuccess(barcode); mStringBufferResult.setLength(0); } /** * 掃碼槍事件解析 * @param event */ public void analysisKeyEvent(KeyEvent event) { int keyCode = event.getKeyCode(); //字母大小寫(xiě)判斷 checkLetterStatus(event); if (event.getAction() == KeyEvent.ACTION_DOWN) { char aChar = getInputCode(event);; if (aChar != 0) { mStringBufferResult.append(aChar); } if (keyCode == KeyEvent.KEYCODE_ENTER) { //若為回車(chē)鍵,直接返回 mHandler.removeCallbacks(mScanningFishedRunnable); mHandler.post(mScanningFishedRunnable); } else { //延遲post,若500ms內(nèi),有其他事件 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鍵,表示大寫(xiě) mCaps = true; } else { //松開(kāi)shift鍵,表示小寫(xiě) mCaps = false; } } } //獲取掃描內(nèi)容 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) { //數(shù)字 aChar = (char) ('0' + keyCode - KeyEvent.KEYCODE_0); } else { //其他符號(hào) 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 { void onScanSuccess(String barcode); } public void onDestroy() { mHandler.removeCallbacks(mScanningFishedRunnable); mOnScanSuccessListener = null; } //部分手機(jī)如三星,無(wú)法使用該方法 // private void hasScanGun() { // Configuration cfg = getResources().getConfiguration(); // return cfg.keyboard != Configuration.KEYBOARD_NOKEYS; // } // /** // * 掃描槍是否連接 // * @return // */ // public boolean hasScanGun() { // // if (mBluetoothAdapter == null) { // return false; // } // // 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) { // mDeviceName = bluetoothDevice.getName(); // return isInputDeviceExist(mDeviceName); // } // // } // // return false; // // } /** * 輸入設(shè)備是否存在 * @param deviceName * @return */ private boolean isInputDeviceExist(String deviceName) { int[] deviceIds = InputDevice.getDeviceIds(); for (int id : deviceIds) { if (InputDevice.getDevice(id).getName().equals(deviceName)) { return true; } } return false; } /** * 是否為掃碼槍事件(部分機(jī)型KeyEvent獲取的名字錯(cuò)誤) * @param event * @return */ @Deprecated public boolean isScanGunEvent(KeyEvent event) { return event.getDevice().getName().equals(mDeviceName); } }
2. active里面實(shí)現(xiàn)代理方法
//實(shí)現(xiàn)上述類(lèi)接口‘ public class MainActivity extends AppCompatActivity implements ScanGunKeyEventHelper.OnScanSuccessListener //重寫(xiě)掃碼槍識(shí)別返回?cái)?shù)據(jù) @Override public void onScanSuccess(String barcode) { barCode = barcode; if (barcode != null && recordPrice > 0 && payString.equals ("readyPay")) { payDishs(); } } //重寫(xiě)捕捉到掃碼槍事件 @Override public boolean dispatchKeyEvent(KeyEvent event) { mScanGunKeyEventHelper.analysisKeyEvent(event); return true; }
dispatchKeyEvent里面分發(fā)事件一定設(shè)置 return true,否則掃碼槍事件傳遞到屏幕其他按鈕上
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
實(shí)例詳解Android快速開(kāi)發(fā)工具類(lèi)總結(jié)
這篇文章主要介紹了實(shí)例詳解Android快速開(kāi)發(fā)工具類(lèi)總結(jié)的相關(guān)資料,需要的朋友可以參考下2016-01-01使用androidx BiometricPrompt實(shí)現(xiàn)指紋驗(yàn)證功能
這篇文章主要介紹了使用androidx BiometricPrompt實(shí)現(xiàn)指紋驗(yàn)證功能,對(duì)android指紋驗(yàn)證相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧2021-07-07Android Retrofit 中文亂碼問(wèn)題的解決辦法
這篇文章主要介紹了Android Retrofit 中文亂碼問(wèn)題的解決辦法的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家遇到這種問(wèn)題及時(shí)的解決,需要的朋友可以參考下2017-10-10Android實(shí)現(xiàn)隱私政策彈窗與鏈接功能
現(xiàn)在幾乎所有的應(yīng)用市場(chǎng)都要求應(yīng)用上架需要用戶(hù)協(xié)議/隱私政策,本篇內(nèi)容將介紹如何在APP內(nèi)植入一個(gè)隱私政策彈窗與鏈接,對(duì)Android隱私政策彈窗實(shí)現(xiàn)代碼感興趣的朋友跟隨小編一起看看吧2021-07-07關(guān)于Android實(shí)現(xiàn)簡(jiǎn)單的微信朋友圈分享功能
這篇文章主要介紹了關(guān)于Android實(shí)現(xiàn)簡(jiǎn)單的微信朋友圈分享功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下2017-02-02Android 藍(lán)牙連接 ESC/POS 熱敏打印機(jī)打印實(shí)例(ESC/POS指令篇)
這篇文章主要介紹了Android 藍(lán)牙連接 ESC/POS 熱敏打印機(jī)打印實(shí)例(ESC/POS指令篇),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04Android Studio使用教程(二):基本設(shè)置與運(yùn)行
這篇文章主要介紹了Android Studio使用教程(二):基本設(shè)置與運(yùn)行,本文講解了項(xiàng)目結(jié)構(gòu)、偏好設(shè)置、常用功能介紹、創(chuàng)建模擬器等內(nèi)容,需要的朋友可以參考下2015-05-05Kotlin Lambda表達(dá)式實(shí)踐使用介紹
lambda 本質(zhì)上是可以傳遞給函數(shù)的一小段代碼,Kotlin 與 Java 中的 Lambda 有一定的區(qū)別,除了對(duì) lambda 的全面支持外,還有內(nèi)聯(lián)函數(shù)等簡(jiǎn)潔高效的特性。下面我們來(lái)仔細(xì)看一下2022-12-12Flutter?將Dio請(qǐng)求轉(zhuǎn)發(fā)原生網(wǎng)絡(luò)庫(kù)的實(shí)現(xiàn)方案
這篇文章主要介紹了Flutter?將Dio請(qǐng)求轉(zhuǎn)發(fā)原生網(wǎng)絡(luò)庫(kù),需要注意添加NativeNetInterceptor,如果有多個(gè)攔截器,例如LogInterceptors等等,需要將NativeNetInterceptor放到最后,需要的朋友可以參考下2022-05-05