Android设备获取扫码枪扫描内容
條形碼掃碼槍現在隨處可見,可以很迅速地掃描出條形碼內容,比什么手機相機掃碼快了不是一點兩點。
為了節約成本,掃碼槍可以直接通過藍牙連接android或其他設備。
那么android設備如何通過藍牙獲取掃描內容的呢?
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() {@Overridepublic 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*/@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {if (isScanGunEvent(event)) {mScanGunKeyEventHelper.analysisKeyEvent(event);return true;}return super.dispatchKeyEvent(event);}/*** 顯示掃描內容* @param barcode 條形碼*/@Overridepublic 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;}總結
以上是生活随笔為你收集整理的Android设备获取扫码枪扫描内容的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Arduino SPI + SPI Fl
- 下一篇: Ubuntu系统中wineHQ的卸载