Android设备标准HID协议(外接输入设备)接入蓝牙扫描枪的各种坑与解决办法
因工作需要最近在做一款藍牙條碼、二維碼掃描器槍支持Android設備(執行標準HID協議)的外接輸入設備,在開發過程中遇到一些問題,在此記錄下來,以便供大家借鑒學習,希望有類似需求的同行少走些彎路。好了,廢話不多說步入正題:
我們的需求大致是這樣的:
? ? ?調用系統設置藍牙進行藍牙連接,連接成功后獲取藍牙掃描槍的數據內容,最后將得到的數據做下一步的邏輯處理。
網上我找了很多的資料,也發現了前人造的很多的輪子,其中最主要有一篇是很值得借鑒與學習的,我將地址放置在下面,大家也可以參考借鑒一下:
Android設備獲取掃碼槍掃描內容-一座小樓的專欄
其中詳細描述了android設備與藍牙掃描槍配對鏈接、狀態獲取、權限添加以及數據內容的掃描獲取等處理。
與他有一點不同的是我需要在碎片(Fragment)上去處理dispatchKeyEvent(KeyEvent event)事件,至于怎么去調用下面告訴大家一個方法。
1.在Fragment中調用Activity的回調方法dispatchKeyEvent(KeyEvent event)
對于此,網上同樣也是介紹了一大堆,我才用的方法是:
@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {if(event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){return super.dispatchKeyEvent(event);}else{if (mDispatchKeyEvent != null) {mDispatchKeyEvent.dispatchKeyEvent(event);}return true;}}public interface DispatchKeyEvent{public void dispatchKeyEvent(KeyEvent event);}public void setOnDispatchKeyEvent(DispatchKeyEvent mDispatchKeyEvent){this.mDispatchKeyEvent = mDispatchKeyEvent;}在Activity重寫 dispatchKeyEvent(KeyEvent event)方法,并向外提供接口 DispatchKeyEvent
讓Fragment實現接口,同時回調自定義的方法
public void dispatchKeyEvent(KeyEvent event);即可解決Fragment調用dispatchKeyEvent方法的問題了。2.掃描槍獲取到內容以后,程序無故退出。
程序調試過程中,出現:
09-21 09:24:03.377: W/Binder(1005): Caught a RuntimeException from the binder stub implementation. 09-21 09:24:03.377: W/Binder(1005): java.lang.NullPointerException 09-21 09:24:03.377: W/Binder(1005): at android.inputmethodservice.IInputMethodWrapper.setSessionEnabled(IInputMethodWrapper.java:280) 09-21 09:24:03.377: W/Binder(1005): at com.android.internal.view.IInputMethod$Stub.onTransact(IInputMethod.java:129) 09-21 09:24:03.377: W/Binder(1005): at android.os.Binder.execTransact(Binder.java:404) 09-21 09:24:03.377: W/Binder(1005): at dalvik.system.NativeStart.run(Native Method) 09-21 09:24:03.377: W/InputMethodManagerService(823): Got RemoteException sending setActive(false) notification to pid 16942 uid 1000警告異常,查找相關資料,大家無非是以下幾種辦法:
在清單文件相應的Activity目錄下添加
android:configChanges="keyboard|keyboardHidden|orientation|navigation|screenSize"Activity中重寫
我按照以上方法操作,結果均未解決我的程序出現的問題,至此,我懷疑是不是有其他的自己沒有注意到的細節導致的呢(因為在Demo中Activity頁面沒有Edittext的情況下,掃描槍掃描獲取到數據一切都是正常的),于是我又仔細看了一邊代碼,并且查看了一下外接鍵盤調用所觸發方法的執行順序:
當鍵盤按下(不松開)時的觸發順序 -> dispatchKeyEvent –> onUserInteraction –> onKeyDown
如果按下緊接著松開,則會緊跟再觸發–> dispatchKeyEvent –> onUserInteraction–>onKeyUp
由此看來每次點擊松開的過程中dispatchKeyEvent是觸發兩次。dispatchKeyEvent是做按鍵處理和分發的工作
明白了以上原理方法執行的順序之后,我去查找,原來我最初的寫法是
@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {if (mDispatchKeyEvent != null) {mDispatchKeyEvent.dispatchKeyEvent(event);}return super.dispatchKeyEvent(event);}public interface DispatchKeyEvent{public boolean dispatchKeyEvent(KeyEvent event);}public DispatchKeyEvent mDispatchKeyEvent;public void setOnDispatchKeyEvent(DispatchKeyEvent mDispatchKeyEvent){this.mDispatchKeyEvent = mDispatchKeyEvent;} @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {finish();}return super.onKeyDown(keyCode, event);}這就豁然開朗了,是自己在 dispatchKeyEvent方法中執行回調方法時并沒有自己處理事件,系統默認返回
return super.dispatchKeyEvent(event);使得界面相應onKeyDown()方法導致界面退出了。
總結
以上是生活随笔為你收集整理的Android设备标准HID协议(外接输入设备)接入蓝牙扫描枪的各种坑与解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8种方法增加你的英文网站流量
- 下一篇: 人类附身机器人获得永生_2045年人类将