android 後臺監聽按鍵事件方法及demo

demo下載地址

https://download.csdn.net/download/u010672559/10592732

===============

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章