實現方案需求:Android機器上有個Wifi物理按鍵,現在需求通過點擊“wifi物理按鍵”能夠快速的開啟/關閉wifi。
經過思考之后,擬出下面幾種方案:
方案一,在linux kernel的驅動中捕獲“wifi物理按鍵”。在kernel的按鍵驅動中截獲“wifi”按鍵,并對其進行處理:若是“wifi”是開啟的,則關閉wifi;否則,打開wifi。
方案二,在Android中添加一個服務,監聽wifi按鍵消息。若監聽到“wifi”按鍵,則讀取wifi的狀態:若是“wifi”是開啟的,則關閉wifi;否則,打開wifi。
方案三,在Android的input輸入子系統的框架層中捕獲wifi按鍵,并進行相應處理。若捕獲到“wifi”按鍵,則讀取wifi的狀態:若是“wifi”是開啟的,則關閉wifi;否則,打開wifi。
方案一
方案思路: 在linux kernel的驅動中捕獲“wifi物理按鍵”。在kernel的按鍵驅動中截獲“wifi”按鍵,并對其進行處理:若是“wifi”是開啟的,則關閉wifi;否則,打開wifi。
方案分析: 若采用此方案需要解決以下問題
01,在kerne的按鍵驅動中捕獲“wifi”按鍵。
-- 這個問題很好實現。在kernel的按鍵驅動中,對按鍵值進行判斷,若是wifi按鍵,則進行相應處理。
02,在kernel中讀取并設置wifi的開/關狀態。
-- 這個較難實現。因為wifi驅動的開/關相關的API很難獲取到。一般來來說,wifi模組的驅動都是wifi廠家寫好并以.ko文件加載的。若需要獲取wifi的操作API,需要更廠家一起合作;讓它們將接口開放,并讓其它設備在kernel中可以讀取到。
03,在kernel中將wifi的狀態上報到Android系統中。若單單只是實現02步,只是簡單的能開/關wifi了;但還需要向辦法讓Android系統直到wifi的開/關行為。
-- 可以實現,但是太麻煩了。
方案結論: 實現難度太大!
方案二
方案思路: 在Android中添加一個服務,監聽wifi按鍵消息。若監聽到“wifi”按鍵,則讀取wifi的狀態:若是“wifi”是開啟的,則關閉wifi;否則,打開wifi。
方案分析: 若采用此方案需要解決以下問題
01,將kernel的wifi按鍵上傳到Android系統中。
-- 這個可以實現。首先,我們將wifi按鍵映射到一個sys文件節點上:按下wifi按鍵時,sys文件節點的值為1;未按下wifi按鍵時,sys文件節點的值為0。其次,通過NDK編程,讀取該sys文件節點,并將讀取的接口映射注冊到JNI中。最后,通過JNI,將該接口對應注冊到Android系統中,使應用程序能夠讀取該接口。
02,在Android系統中添加一個服務,不斷讀取wifi按鍵狀態。
-- 這個也可以實現。由于“01”中,我們已經將wifi的按鍵狀態通過JNI注冊到Android系統中;我們這里就可以讀取到。
03,讀取并設置wifi的開/關狀態。
-- 這個也可以實現。在Android系統中,我們可以通過WifiManager去讀取/設置wifi的開/關狀態。通過WifiManager設置的wifi狀態,是全局的。
架構圖:

具體實現:
通過驅動,將wifi按鍵狀態映射到文件節點。由于不同平臺差異,具體的代碼接口可能有所差異;我所工作的平臺是RK3066,所以還是以此來進行介紹。
01 將kernel的wifi按鍵上傳到Android系統中
在按鍵驅動中編輯wifi按鍵的驅動:主要的目的是將wifi按鍵映射到某個鍵值上,方便后面Android系統調用。因為Android系統使用的按鍵值和Linux內核使用的按鍵值不一樣,Android會通過一個鍵值映射表,將Linux的按鍵值和Android的按鍵值映射起來。
新聞熱點
疑難解答