1.概述:理論上要在任何介面接收按鍵事件應該是系統去做處理的,apk自己起後台服務的話,服務又不能監聽按鍵事件,但是可以用設定裡面的輔助功能的accessibilityservice也可監聽按鍵事件,但是前提是需要在設定中開啟此輔助功能的開關才行,前面的網上都有demo可以參考,但是前陣子遇到的需求是客製化的機器,裡面的系統原生的settings已被裁剪及修改,且不能修改原始碼,所以以上方法都不行,但是機器是root的機器,所以網上找了只能用直接讀取輸入裝置檔案的方法去實現需求,及參考系統的按鍵上報的流程去實現,參考的是網上的這個demo,然後基於此demo做的修改實現的需求功能,具體邏輯鍵、見demo
2.**邏輯說明:
接收系統開機廣播後啟動乙個後台服務,後台服務執行起乙個執行緒執行while死迴圈每隔100ms去讀取裝置/dev/input/event節點的event的值(通過jni實現,讀取裝置節點前需先開啟節點,第一次在不確定裝置節點時需要遍歷查詢是哪個節點,找到節點之後就不用遍歷了),當有按鍵按下時event的type和value為1,此時記錄按鍵鍵值(注意此處上報鍵值和activity中的keyevent的值不對應)
注意:按鍵事件節點值可能會因裝置韌體不同而不同,可能為event0,event1或其他eventx,所以開始需要遍歷查詢是哪個節點,測試哪個節點方法為adb shell 後輸入getevent /dev/input/event0然後觀察按鍵按下時adb下面是否有列印
3.demo除錯記錄:
網上的demo在ndk編譯的時候報錯,需要根據錯誤提示修改相應的地方,除錯demo時需要會除錯ndk和jni,原始demo中還有傳送按鍵事件的方法,此demo只用到了讀的方法監聽按鍵事件,系統原始的讀取裝置節點方法為輪詢裝置/dev/input/event下的節點值,如果有值就上報,實際demo也是參考此邏輯實現按鍵監聽事件,裝置在通過jni開啟裝置時不能用**馬上讀取到按鍵的值,此時會返回-1,實際除錯時注意延遲時間的設定,這個決定了按鍵檢測的靈敏度,也注意看event的3個屬性值這個值的列印會告訴你按鍵事件按下等邏輯
android 中如何監聽按鍵的長按事件
1,key 實體按鍵,現在手機物理按鍵越來越少 常見的有 keycode volume down up keycode power keycode back keycode home keycode menu 在乙個activity 過載父類 的下面這三個方法來處理按鍵事件 public boole...
vue監聽鍵盤事件中的按鍵
在vue中,已經為常用的按鍵設定了別名,這樣我們就無需再去匹配keycode,直接使用別名就能監聽按鍵的事件。別名 實際鍵值 delete delete 刪除 backspace 退格 tab tab.enter enter 回車 esc esc 退出 space space 空格鍵 left le...
Android監聽USB插拔事件
android監聽usb插拔事件有兩種方式 一種是在mainifest.xml中註冊 android.hardware.usb.action.usb device attached即在usb插入是的action意圖。在android.hardware.usb.usbmanager類中有多種actio...