android 後臺監聽按鍵事件方法及demo
demo下載地址
===============
1.概述:最方便的方式還是修改系統原始碼按鍵事件,將鍵值發廣播出來給應用監聽,其次是用設定裡面的輔助功能的AccessibilityService也可監聽按鍵事件,但是前提是需要在設定中開啟此輔助功能的開關才行,前面的網上都有demo可以參考,但是前陣子遇到的需求是客製化的機器,裡面的系統原生的settings已被裁剪及修改,且不能修改原始碼,所以以上方法都不行,但是機器是root的機器,所以網上找了只能用直接讀取輸入裝置檔案的方法去實現需求,及參考系統的按鍵上報的流程去實現,參考的是網上的https://github.com/radhoo/android-event-injector
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個屬性值這個值的列印會告訴你按鍵事件按下等邏輯