理解
Android處理Key Events和KeyCode定義,在 frameworks/base/core/java/android/view/KeyEvent.java中,以及frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java中,Android自行定義了新的KeyCode。這與Linux中input.h所定義的keycode value有所不同,合理的猜測其中必然做過transfer的動作,這才能讓Kernel與Android 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.kl的input event