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

歡迎訪問 生活随笔!

生活随笔

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

Android

Android设备标准HID协议(外接输入设备)接入蓝牙扫描枪的各种坑与解决办法

發布時間:2024/3/26 Android 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中重寫

@Override public void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);}方法等。

我按照以上方法操作,結果均未解決我的程序出現的問題,至此,我懷疑是不是有其他的自己沒有注意到的細節導致的呢(因為在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协议(外接输入设备)接入蓝牙扫描枪的各种坑与解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。

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