標籤:input.h reserve sde target channel 就是 更新 als developer
本文轉載自:http://developer.t-firefly.com/thread-251-1-1.html
網上存在一些關於Android系統添加自訂按鍵的文章,但大多針對Android2.3和4.0系統的,許多檔案都已經變動位置了,這兩天我總結了一些,寫出來歡迎大家交流與指正:
Android系統通過*.kl檔案將Linux按鍵傳給上層,最新的Android4.4已經不再預設qwerty.kl檔案了,代之的是frameworks/base/data/keyboards/Generic.kl檔案,當然如果定義板級索引值檔案,還是以rk29-keypad.kl檔案優先。
在3288/device/rockchip/rksdk目錄下的rk29-keypad.kl檔案中有相關索引值的定義:
- key 59 MENU
- key 102 HOME
- key 114 VOLUME_DOWN
- key 115 VOLUME_UP
- key 116 POWE WAKE
- key 143 NOTIFICATION WAKE
- key 158 BACK
- key 212 CAMERA
- key 217 SEARCH
複製代碼
說明:WAKE: 當裝置睡眠時按下此鍵,裝置將被喚醒,按鍵事件將會被發送到應用程式。WAKE_DROPPED: 當裝置睡眠時按下此鍵,裝置將被喚醒,而按鍵事件不會被發送到應用程式。
瑞星微的按鍵分為GPIO和ADC兩種,定義在/kernel/arch/arm/boot/dts目錄下的firefly-rk3288.dts檔案:
- &adc {
- status = "okay";
- key {
- compatible = "rockchip, key";
- io-channels = <&adc 1>;
- vol-up-key {
- linux, code = <115>;
- label = "volume up";
- rockchip, adc_value = <1>;
- };
- vol-down-key {
- linux, code = <114>;
- label = "volume down";
- rockchip, adc_value = <170>;
- };
- power-key {
- gpios = <&gpio0 GPIO_A4 GPIO_ACTIVE_LOW>;
- linux, code = <116>;
- label = "power";
- gpio-key, wakeup; // 具有喚醒功能
- };
- menu-key {
- linux, code = <139>;
- label = "menu";
- rockchip, adc_value = <355>;
- };
- home-key {
- linux, code = <102>;
- label = "home";
- rockchip, adc_value = <746>;
- };
- back-key {
- linux, code = <158>;
- label = "back";
- rockchip, adc_value = <560>;
- };
- camera-key {
- linux, code = <212>;
- label = "camera";
- rockchip, adc_value = <450>;
- };
- };
複製代碼 先在linux核心中添加新的按索引值(當然不用宏定義直接寫數值也可以),網上一般寫在/include/linux/input/input.h檔案中添加,實際3.10核心在/include/uapi/ linux/input.h檔案中:#defineKEY_RESERVED 0#define KEY_ESC 1#define KEY_1 2...#defineKEY_MY 250
對於Android層次,在rk29-keypad.kl檔案中增加按索引值後,還需要修改一些檔案,系統才能處理,首先修
改KeycodeLabels.h檔案,4.4版本將其移到了frameworks/native/include/input目錄下,對KEYCODES數組添加按鍵碼:
static const KeycodeLabelKEYCODES[] = {
...
{ "MY_KEYS" ,250}, { NULL,0 }
最後一定要以NULL結尾,其中的TV_KEYMOUSE_LEFT按鍵就是瑞星微添加的,再去frameworks/native/include/android/keycode.h檔案中添加:enum {
AKEYCODE_UNKNOWN = 0,
....
....
添加
AKEYCODE_MY_KEYS =250,
同樣AKEYCODE_TV_KEYMOUSE_LEFT宏也是瑞星微添加的,如果要添加系統按索引值,還需要修改frameworks/base/libs/ui/input.java(android4.4已變為frameworks/native/libs/input/input.cpp)檔案:boolKeyEvent::hasDefaultAction(int32_t keyCode){ switch (keyCode) { case AKEYCODE_HOME: case AKEYCODE_BACK: ... case AKEYCODE_MY_KEYS: return true;
還有下面的:boolKeyEvent::isSystemKey(int32_t keyCode) { switch (keyCode) { case AKEYCODE_MENU: ... case AKEYCODE_MY_KEYS: return true; } return false;}
還要修改frameworks/base/core/java/android/view/KeyEvent.java檔案:
public staticfinal int KEYCODE_TV_MEDIA_PAUSE = 249;public staticfinal int KEYCODE_MY_KEYS = 250;private staticfinal int LAST_KEYCODE = KEYCODE_MY_KEYS;
注意一定要修改LAST_KEYCODE,下面的populateKeycodeSymbolicNames數組也需要添加:names.append(KEYCODE_MY_KEYS, " KEYCODE_MY_KEYS ");
修改frameworks/base/core/res/res/values/attr.xml檔案:<!--This enum provides the same keycode values as can be found in {@link android.view.KeyEvent}. --><attrname="keycode"> <enum name="KEYCODE_UNKNOWN"value="0" /> ... <enumname="KEYCODE_TV_MEDIA_PAUSE" value="249" /> <enum name="KEYCODE_MY_KEYS" value="250" /></attr>
對於網上說的/external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.h檔案已經移除。
以上檔案都改完之後frameworks/base/api/current.txt也要隨之更新,如果未更新,可運行 makeupdate-api 進行更新 如果對新索引值進行處理,可以通過擷取相應的keycode,對它進行處理。對於按鍵事件的處理一般如下檔案中:
frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@Override public intinterceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn){ ... switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_DOWN: ... case KeyEvent. KEYCODE_MY_KEYS: // 添加處理代碼
Android4.4.2系統添加自訂按鍵【轉】