How to add a new keycode in android

 

理解


 

Android處理Key EventsKeyCode定義,在 frameworks/base/core/java/android/view/KeyEvent.java中,以及frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java中,Android自行定義了新的KeyCode。這與Linuxinput.h所定義的keycode value有所不同,合理的猜測其中必然做過transfer的動作,這才能讓KernelAndroid middle ware以及AP相接合。描述文件在*.kl文件中,有類似如下的映射關係,這是用來做轉換用的:

程序代碼: [選擇]

key 107   ENDCALL           WAKE_DROPPED
key 62    ENDCALL           WAKE_DROPPED
key 229   MENU              WAKE_DROPPED
key 59    MENU              WAKE_DROPPED
key 139   MENU              WAKE_DROPPED
key 127   SEARCH            WAKE_DROPPED
key 228   POUND             WAKE_DROPPED
key 227   STAR
key 231   CALL              WAKE_DROPPED
key 61    CALL              WAKE_DROPPED
key 232   DPAD_CENTER       WAKE_DROPPED
key 108   DPAD_DOWN         WAKE_DROPPED
key 103   DPAD_UP           WAKE_DROPPED
key 102   HOME              WAKE
key 105   DPAD_LEFT         WAKE_DROPPED
key 106   DPAD_RIGHT        WAKE_DROPPED
key 115   VOLUME_UP         WAKE
key 114   VOLUME_DOWN       WAKE
key 116   POWER             WAKE

KeyEvent.java,裏面有一段註釋說明:

程序代碼: [選擇]

// NOTE: If you add a new keycode here you must also add it to:
    //  isSystem()
    //  frameworks/base/include/ui/KeycodeLabels.h
    //  tools/puppet_master/PuppetMaster/nav_keys.py
    //  frameworks/base/core/res/res/values/attrs.xml
    //  commands/monkey/Monkey.java
    //  emulator?
    //
    //  Also Android currently does not reserve code ranges for vendor-
    //  specific key codes.  If you have new key codes to have, you
    //  MUST contribute a patch to the open source project to define
    //  those new codes.  This is intended to maintain a consistent
    //  set of key code definitions across all Android devices.
   
   修改按鍵定義: 
   development/emulator/keymaps/qwerty.kcm
   development/emulator/keymaps/qwerty.kl  
   qwerty.kcm定義了同一個按鍵在不同模式下輸出的值

 

 

android 中如何添加新的鍵值

 


 

android中,上層可使用的鍵值默認情況下是92個,從0-91;一般情況下,這些 鍵值是夠用的,但是如果想擴充的話,還是需要添加新的鍵值的,那麼如何將一個 新的鍵值從驅動的設置映射到上層,使應用可以對我們自定義的鍵值進行相應的處 理呢?

這裏以imx515平臺爲例來說明
 
keypad來說,涉及到的文件有以下幾個:

1.    build/target/board/generic_x86/keymaps/qwerty.kl (vendor/fsl/imx51_BBG/mxckpd.kl)
 
首先在此文件中,添加新的鍵值信息:
Example:

key 59    OFFHOOK
key 60    ONHOOK
key 61    HANDFREE
key 62    PSTNCALLIN

 

scancode的值可以參考input.h中定義的鍵盤的掃描碼


注意:新加的鍵值不要與已有的重複。

2.    kernel_imx/drivers/input/keyboard/imx51-key.c(待定)
在鍵盤驅動中定義相應的鍵盤掃描碼

static unsigned short imx51_keypad_keycode[IMX51_KEY_NUM] =
{
   /*F1*/   1, /*PSTN*/     43, /*
轉移*/    8, /*1*/  9, /*6 */ 50, /***/     14, /*音量》*/ 56,
   /*F2*/   2, /*
留言模式*/ 44, /*畫中畫*/ 45, /*2*/ 10, /*7 */ 51, /*# */    16, /*方向上*/ 17,
   /*F3*/   3, /*
畫面切換*/  5, /*隱私*/   46, /*3*/ 11, /*8 */ 52, /* 重播*/  53, /*方向下*/ 18,
   /*F4*/   4, /*
註銷*/      6, /*靜音*/   47, /*4*/ 12, /*9 */ 13, /* 免提*/  54, /*方向左*/ 19,
   /*F5*/  41, /*
保持*/      7, /*閃斷*/   48, /*5*/ 49, /*0 */ 15, /* 音量《*/55, /*方向右*/ 20,
   /*
取消*/57, /*菜單*/     58,
   /* offhook */  59,  /* onhook */ 60,  /*  
免提 */61,  /* 來電 */62
};

3.    
frameworks/base/include/ui/KeycodeLabels.h

 

1)在數組keycodes 中添加 新定義的信息,

 

要在{NULL, 0}之前添加
static const KeycodeLabel KEYCODES[] = {
...
...
   { "OFFHOOK", 92 },
   { "ONHOOK", 93 },
   { "HANDFREE", 94 },
   { "PSTNCALLIN",95 },

   // NOTE: If you add a new keycode here you must also add it to:
   //   (enum KeyCode, in this file)
   //   frameworks/base/core/java/android/view/KeyEvent.java
   //   tools/puppet_master/PuppetMaster.nav_keys.py
   //   frameworks/base/core/res/res/values/attrs.xml

   { NULL, 0 }
}

 

2)枚舉類型 KeyCode 中添加

 

typedef enum KeyCode {
...
...
   kKeyCodeOFFHOOK = 92,
   kKeyCodeONHOOK = 93,
   kKeyCodeHANDFREE = 94,
   kKeyCodePstnCallIn = 95
}KeyCode;


4.    frameworks/base/core/res/res/values/attrs.xml
添加如下
<enum name="KEYCODE_OFFHOOK" value="92" />
<enum name="KEYCODE_ONHOOK" value="93" />
<enum name="KEYCODE_HANDFREE" value="94" />
<enum name="KEYCODE_PSTNCALLIN" value="95" />

5.  frameworks/base/core/java/android/view/KeyEvent.java

   public static final int KEYCODE_OFFHOOK         = 92;
   public static final int KEYCODE_ONHOOK          = 93;
   public static final int KEYCODE_HANDFREE        = 94;
   public static final int KEYCODE_PSTNCALLIN      = 95;

 
注意:      

 

(1)、private static final int LAST_KEYCODE    = KEYCODE_MUTE;
             
應改爲:    private static final int LAST_KEYCODE           = KEYCODE_PSTNCALLIN;

 

(2)、在函數 public final boolean isSystem() 中,同樣需要添加:
       case KEYCODE_OFFHOOK:
       case KEYCODE_ONHOOK:
       case KEYCODE_HANDFREE:
       case KEYCODE_PSTNCALLIN:
  

(通過以上的更改,新的鍵值就添加上去了,由於更改了 KeyEvent,影響到了API,所以需要make update-api)

           如果對新鍵值進行處理,可以通過獲取相應的keycode,對它進行處理;
   

對於按鍵事件的處理一般如下文件中

 

6.   frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java和PhoneWindow.java

      
綜上可知,我們可以根據需求定義自己的鍵值,並對鍵值所對應的事 件信息進行合理化處理。

 

 

7、我首先在packages/apps/Visux_portal/src/com/yarin/android/Visux_portal/Visux_portal.java文件的keydown中添加相關鍵的處理函數,已驗證該鍵添加成功,即在lunch界面下可以正常運行。

 

注:
     vendor/fsl/imx51_BBG/mxckpd.kl
是專門給imx515輸入設備使用的keylayout文 件,所以修改mxckpd.kl 文件只是給鍵盤輸入增加鍵值。如果是其他設備的輸入, 如x_input,而且當沒有x_iput.kl存在的時候,那麼默認的kl文件就是qwerty.kl(android-root/development/emulator/keymaps/qwerty.kl)

   
這個很重要。也就是說需要實現明白添加的鍵值是否是mxckpd.klinput event

 

發佈了14 篇原創文章 · 獲贊 5 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章