Android设备标准HID协议(外接输入设备)接入蓝牙扫描枪的各种坑与解决办法
因工作需要最近在做一款藍牙條碼、二維碼掃描器槍支持Android設(shè)備(執(zhí)行標準HID協(xié)議)的外接輸入設(shè)備,在開發(fā)過程中遇到一些問題,在此記錄下來,以便供大家借鑒學(xué)習(xí),希望有類似需求的同行少走些彎路。好了,廢話不多說步入正題:
我們的需求大致是這樣的:
? ? ?調(diào)用系統(tǒng)設(shè)置藍牙進行藍牙連接,連接成功后獲取藍牙掃描槍的數(shù)據(jù)內(nèi)容,最后將得到的數(shù)據(jù)做下一步的邏輯處理。
網(wǎng)上我找了很多的資料,也發(fā)現(xiàn)了前人造的很多的輪子,其中最主要有一篇是很值得借鑒與學(xué)習(xí)的,我將地址放置在下面,大家也可以參考借鑒一下:
Android設(shè)備獲取掃碼槍掃描內(nèi)容-一座小樓的專欄
其中詳細描述了android設(shè)備與藍牙掃描槍配對鏈接、狀態(tài)獲取、權(quán)限添加以及數(shù)據(jù)內(nèi)容的掃描獲取等處理。
與他有一點不同的是我需要在碎片(Fragment)上去處理dispatchKeyEvent(KeyEvent event)事件,至于怎么去調(diào)用下面告訴大家一個方法。
1.在Fragment中調(diào)用Activity的回調(diào)方法dispatchKeyEvent(KeyEvent event)
對于此,網(wǎng)上同樣也是介紹了一大堆,我才用的方法是:
@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實現(xiàn)接口,同時回調(diào)自定義的方法
public void dispatchKeyEvent(KeyEvent event);即可解決Fragment調(diào)用dispatchKeyEvent方法的問題了。2.掃描槍獲取到內(nèi)容以后,程序無故退出。
程序調(diào)試過程中,出現(xiàn):
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警告異常,查找相關(guān)資料,大家無非是以下幾種辦法:
在清單文件相應(yīng)的Activity目錄下添加
android:configChanges="keyboard|keyboardHidden|orientation|navigation|screenSize"Activity中重寫
我按照以上方法操作,結(jié)果均未解決我的程序出現(xiàn)的問題,至此,我懷疑是不是有其他的自己沒有注意到的細節(jié)導(dǎo)致的呢(因為在Demo中Activity頁面沒有Edittext的情況下,掃描槍掃描獲取到數(shù)據(jù)一切都是正常的),于是我又仔細看了一邊代碼,并且查看了一下外接鍵盤調(diào)用所觸發(fā)方法的執(zhí)行順序:
當鍵盤按下(不松開)時的觸發(fā)順序 -> dispatchKeyEvent –> onUserInteraction –> onKeyDown
如果按下緊接著松開,則會緊跟再觸發(fā)–> dispatchKeyEvent –> onUserInteraction–>onKeyUp
由此看來每次點擊松開的過程中dispatchKeyEvent是觸發(fā)兩次。dispatchKeyEvent是做按鍵處理和分發(fā)的工作
明白了以上原理方法執(zhí)行的順序之后,我去查找,原來我最初的寫法是
@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方法中執(zhí)行回調(diào)方法時并沒有自己處理事件,系統(tǒng)默認返回
return super.dispatchKeyEvent(event);使得界面相應(yīng)onKeyDown()方法導(dǎo)致界面退出了。
總結(jié)
以上是生活随笔為你收集整理的Android设备标准HID协议(外接输入设备)接入蓝牙扫描枪的各种坑与解决办法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8种方法增加你的英文网站流量
- 下一篇: Android FM 模块学习之四 源码