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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 设备蓝牙连接扫描枪获取扫描内容

發布時間:2024/3/26 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 设备蓝牙连接扫描枪获取扫描内容 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android 設備藍牙連接掃描槍獲取掃描內容

標簽(空格分隔): 未分類


條形掃描槍主要可以掃描條形碼和二維碼等,掃描速度比手機掃描設備快得多,本文簡單介紹android 通過藍牙監聽藍牙連接,當掃描設備連接完成后,掃描設備相當于外接鍵盤,通過監聽外接鍵盤輸入事件,獲取掃描出的內容。
其他參照文檔:https://blog.csdn.net/czhpxl007/article/details/50363766


1.藍牙配對

打開系統設置,藍牙配對掃描槍, 一般掃描槍說明書都有寫,配對完成后,顯示已連接

2.AndroidManifest中配置權限

在中配置藍牙連接所需要的權限

<!-- 藍牙 --><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

3.獲取設備信息,判斷是否連接

這里藍牙設備返回的設備類型是BluetoothClass.Device.Major.PERIPHERAL

/*** 掃描槍是否連接* @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;}/*** 輸入設備是否存在* @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;}

4.構建掃描槍解析類ScanGunKeyEventHelper

使用掃描槍解析類需要在相關類中調用 analysisKeyEvent(KeyEvent event) ,傳入監聽事件,當解析相對應事件獲得輸入內容,通過OnScanSuccessListener 接口回調返回

/*** 掃碼槍事件解析類 by chen*/ public class ScanGunKeyEventHelper {private final static long MESSAGE_DELAY = 500;//延遲500ms,判斷掃碼是否完成。private StringBuffer mStringBufferResult;//掃碼內容private boolean mCaps;//大小寫區分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(); // BluetoothDevice printerdevice = mBluetoothAdapter.getRemoteDevice("ssss"); // BluetoothSocket btSocket = printerdevice.createRfcommSocketToServiceRecord("ssss");mStringBufferResult = new StringBuffer();mHandler = new Handler();mScanningFishedRunnable = new Runnable() {@Overridepublic void run() {performScanSuccess();}};}/*** 返回掃碼成功后的結果*/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();//字母大小寫判斷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 {void onScanSuccess(String barcode);}public void onDestroy() {mHandler.removeCallbacks(mScanningFishedRunnable);mOnScanSuccessListener = null;}//部分手機如三星,無法使用該方法 // 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;}/*** 輸入設備是否存在* @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;}/*** 是否為掃碼槍事件(部分機型KeyEvent獲取的名字錯誤)* @param event* @return*/@Deprecatedpublic boolean isScanGunEvent(KeyEvent event) {return event.getDevice().getName().equals(mDeviceName); }/*** 檢測藍牙是否開啟*/public int checkBluetoothValid() {if(mBluetoothAdapter == null) {//你的設備不具備藍牙功能!return 1;}if(!mBluetoothAdapter.isEnabled()) {//藍牙設備未打開,請開啟此功能后重試!return 2;}return 3;//藍牙正常工作}}

5.在Activity中使用解析類ScanGunKeyEventHelper

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

/*** 截獲按鍵事件.發給ScanGunKeyEventHelper** @param event* @return*/@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {if (mScanGunKeyEventHelper.isScanGunEvent(event)) {mScanGunKeyEventHelper.analysisKeyEvent(event);return true;}return super.dispatchKeyEvent(event);}

獲取掃描結果回調,詳細代碼請查看TestScanner

/*** @author Wu JianCheng* @date on 2018/12/18 14:44* 測試藍牙連接掃描槍功能*/ public class BleAct extends Activity implements ScanGunKeyEventHelper.OnScanSuccessListener {.../*** 掃描結果回調* @param barcode*/@Overridepublic void onScanSuccess(String barcode) {showToast(barcode);}...}

總結

以上是生活随笔為你收集整理的Android 设备蓝牙连接扫描枪获取扫描内容的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。