Android 设备蓝牙连接扫描枪获取扫描内容
生活随笔
收集整理的這篇文章主要介紹了
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 设备蓝牙连接扫描枪获取扫描内容的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个简单HTML5期末考核大作业,学生个
- 下一篇: Android FM模块学习之四源码解析