Android4.4.2系統添加自訂按鍵【轉】

來源:互聯網
上載者:User

標籤: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檔案中有相關索引值的定義:
  1. key 59    MENU
  2. key 102   HOME
  3. key 114   VOLUME_DOWN
  4. key 115   VOLUME_UP
  5. key 116   POWE                WAKE
  6. key 143   NOTIFICATION       WAKE
  7. key 158   BACK
  8. key 212   CAMERA
  9. key 217   SEARCH
複製代碼

 說明:WAKE: 當裝置睡眠時按下此鍵,裝置將被喚醒,按鍵事件將會被發送到應用程式。WAKE_DROPPED: 當裝置睡眠時按下此鍵,裝置將被喚醒,而按鍵事件不會被發送到應用程式。

 

       瑞星微的按鍵分為GPIO和ADC兩種,定義在/kernel/arch/arm/boot/dts目錄下的firefly-rk3288.dts檔案:
  1. &adc {        
  2.           status = "okay";
  3.           key {               
  4.                  compatible = "rockchip, key";               
  5.                  io-channels = <&adc 1>;
  6.                  vol-up-key {                       
  7.                          linux, code = <115>;                       
  8.                          label = "volume up";                       
  9.                          rockchip, adc_value = <1>;               
  10.                  };
  11.                  vol-down-key {                       
  12.                         linux, code = <114>;                       
  13.                         label = "volume down";                       
  14.                         rockchip, adc_value = <170>;               
  15.                  };
  16.                  power-key {                        
  17.                        gpios = <&gpio0 GPIO_A4 GPIO_ACTIVE_LOW>;                        
  18.                        linux, code = <116>;                     
  19.                        label = "power";                       
  20.                        gpio-key, wakeup;  // 具有喚醒功能               
  21.                  };
  22.                  menu-key {                        
  23.                        linux, code = <139>;                        
  24.                        label = "menu";                       
  25.                        rockchip, adc_value = <355>;         
  26.                  };
  27.                  home-key {               
  28.                       linux, code = <102>;
  29.                       label = "home";
  30.                       rockchip, adc_value = <746>;
  31.                 };
  32.                 back-key {
  33.                       linux, code = <158>;
  34.                       label = "back";
  35.                       rockchip, adc_value = <560>;
  36.                };
  37.                camera-key {
  38.                       linux, code = <212>;
  39.                       label = "camera";
  40.                       rockchip, adc_value = <450>;
  41.               };         
  42.       };
複製代碼       先在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系統添加自訂按鍵【轉】

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.