安卓新增返回鍵 菜單鍵 HOME鍵 基於高通平台

2021-09-19 03:46:29 字數 3032 閱讀 5949

2019-.4-22補充說明:

這兩天又看了一下關於安卓按鍵的整個處理流程,現總結如下。

首先在linux驅動框架中按鍵值稱為掃瞄碼,而安卓應用中使用的按鍵值稱為keycode其也是乙個整數值,但是與linux中掃瞄碼不同。linux掃瞄碼需要經過兩次轉換才能轉換為安卓層的keycode碼,首先在keylayout(按鍵布局)檔案*.kl檔案中把linux掃瞄碼轉化為keycodelabel字串,在keycode陣列中把keycodelabel字串轉化為安卓keycode碼。

frameworks/native/include/android/keycodes.h中定義了keycode碼

enum ;
frameworks/native/include/input/inputeventlabels.h中定義了keycode碼和keycodelabel字串的對應關係

#define define_keycode(key) 

static const inputeventlabel keycodes =

define_keycode(soft_left), // =

define_keycode(soft_right), // =

define_keycode(home), // =

define_keycode(back), // =

... ...

define_keycode(volume_up), // =

define_keycode(volume_down), // =

... ...

define_keycode(menu), // =

... ...

define_keycode(help), // =

};

在按鍵布局(keylayout)檔案中定義了linux掃瞄碼和 keycodelabel字串的對應關係

如在gpio-keys.kl檔案中有

key 115   volume_up

key 114 volume_down

key 102 home

key 528 focus

在安卓系統存在多個鍵盤布局檔案(keylayout),則具體某個驅動檔案呼叫哪個kl檔案是根據驅動的名字來確定的,如果找不到與驅動名字相同的檔案,就會讀取預設檔案generic.kl。如名字為gpio-keys的驅動就會讀取gpio-keys.kl檔案,如果該檔案不存在,則讀取generic.kl檔案。

2019-04-18 補充說明:

原以為這個東西很簡單,像***這樣設定一下就可以了,今天自己重新編譯系統然後燒錄進去之後發現除了home按鍵能正常工作之外,menu+back按鍵都不能正常工作,同樣的方法在linux kernel源**中尋找這三個io使用區別,但是很遺憾沒找到不同的地方,只能想著是安卓上層的原因了,於是看了一下安卓的源**,發現確實是不一樣的,在gpio-keys.kl有下面的**

key 115   volume_up

key 114 volume_down

key 102 home

key 528 focus

從**可以看到這個檔案中沒有設定back和menu按鍵的值,我想應該把back和menu的值加上去之後就可以了(還沒有親自測試過,待測試之後再把結果告訴大家)。看來要想支援實體按鍵不僅需要linux原始碼層支援,還需要安卓層支援,這兩者相互合作才能達到目的。

先說一下背景:

新入手了乙個開發板,開發板帶有back+home+menu實體按鍵,還有兩個實體的音量加減按鍵。但是開機後發現音量鍵都是可以正常使用的,另外三個按鍵無法正常使用,在按鍵沒有按下時測量這幾個按鍵的電壓發現音量鍵的電壓是1.8v,另外三個按鍵的電壓則是0v。根據電壓值可推測,應該是在系統內部沒有對這三個io設定導致這幾個io不能體現其正常的功能。

既然要使用這幾個實體按鍵,就只能老老實實的檢視**把功能新增上去了,這裡我先說明一下,其實把按鍵對應的功能新增上非常容易,但是由於自己第一次做這樣的工作,因此記錄一下自己的想法和方法。

首先,這5個按鍵都是通過gpio和soc鏈結的,既然音量鍵能正常工作就看這幾個按鍵和音量鍵的gpio設定有哪些區別唄,首先檢視dtsi中裝置樹中這幾個gpio有哪些區別,發現在某個檔案中有以下**。

gpio_keys ;  

vol_down ;

};

根據硬體鏈結可以知道音量「+」使用的時gpio15,音量「-」使用的是gpio8剛好和裝置樹中的gpios對應,故感覺這個就是音量相關的裝置樹的配置,那就嘗試這找driver中的**吧,看看驅動中是如何使用這些屬性的。根據compatible = "gpio-keys"在找到了對應的驅動檔案,翻閱了一下驅動檔案好像也並沒有對vol_up和vol_down做特別的處理,只是讀取了裝置樹的屬性,然後根據這些屬性進行設定。既然這樣,那直接把home+menu+back按鍵的屬性新增上去不就大功告成了,這樣想著就把back+menu+home對應的按鍵新增到了

gpio_keys ;

vol_down;

home_key ;

back_button ;

menu_button ;

};

tlmm_gpio_key ;   

gpio_key_suspend: gpio_key_suspend ;

};

看到這裡就只有把back+menu+home對應的gpio加入到這裡了,**如下

tlmm_gpio_key ;   

gpio_key_suspend: gpio_key_suspend ;

};

總體上說,做過一次之後這個東西很簡單,只是在裝置樹中新增相應的屬性即可。

監聽安卓退出鍵 菜單鍵 home鍵

一 監聽退出鍵和菜單鍵很簡單,由於cclayer繼承了cckeypaddelegate 1.所以自己定義的層繼承與cclayer後,只需要宣告兩個虛函式 virtual void keybackclicked virtual void keymenuclicked 2.並且在init中啟用監聽 啟動...

Android 模擬返回鍵 菜單鍵 主頁鍵

用runtime模擬按鍵操作 param keycode 按鍵事件 keyevent 的按鍵值 private void sendkeycode1 int keycode catch exception e 使用instrumentation介面 對於非自行編譯的安卓系統,無法獲取系統簽名,只能在前...

遮蔽安卓系統Home鍵

settings.system.putint getcontentresolver 1 settings.system.putint getcontentresolver 0 寫字串settings system putstring contentresolver resolver,string n...