這裏添加新的鍵值,不是毫無憑據憑空創造的一個鍵值,
而是根據kernel中檢測到的按鍵值,而後轉化爲android所須要的數值:
以添加一個linux鍵值爲217,把它映射爲android的鍵值Browser(這個鍵值以前不存在)爲例介紹一下:
1、android以前沒有這個鍵值,須要定義
/frameworks/base/core/java/android/view/KeyEvent.java
//定義這個新的鍵值
public static final int KEYCODE_BROWSER = 220;(在我這套代碼裏已經最大是219了,因此咱們新加一個定義爲220)
而後咱們會看到有以下注釋:java
- // NOTE: If you add a new keycode here you must also add it to:
- // isSystem()
- // native/include/android/keycodes.h
- // frameworks/base/include/ui/KeycodeLabels.h
- // external/webkit/WebKit/android/plugins/ANPKeyCodes.h
- // frameworks/base/core/res/res/values/attrs.xml
- // emulator?
- // LAST_KEYCODE
- // KEYCODE_SYMBOLIC_NAMES
- //
- // 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.
LAST_KEYCODE也就是最後一個keycode,由於添加了新的,因此須要更改這個的數值linux
- LAST_KEYCODE = KEYCODE_BROWSER
- private static final
- SparseArray KEYCODE_SYMBOLIC_NAMES = new SparseArray();
- private static void populateKeycodeSymbolicNames() {
- ……
- names.append(KEYCODE_MUSIC, "KEYCODE_MUSIC");
- names.append(KEYCODE_CALCULATOR, "KEYCODE_CALCULATOR");
- names.append(KEYCODE_BROWSER, "KEYCODE_BROWSER");
- }
上面的註釋已經爲咱們指明瞭添加鍵值所須要的步驟:
2、/frameworks/base/core/java/android/view/KeyEvent.javaandroid
- public final boolean isSystem() {
- return native_isSystemKey(mKeyCode);
- }
- /frameworks/base/jni/android_view_KeyEvent.java
- static jboolean native_isSystemKey(JNIEnv* env, jobject clazz, jint
- keyCode) {
- return KeyEvent::isSystemKey(keyCode);
- }
- /frameworks/base/libs/androidfw/Input.cpp
- bool KeyEvent::isSystemKey(int32_t keyCode) {
- switch (keyCode) {
- ……
- case AKEYCODE_BROWSER:
- return true;
- }
- }
3、/frameworks/native/include/android/keycodes.hweb
- /*
- * Key codes.
- */
- enum {
- ……
- AKEYCODE_CALCULATOR = 210,
- AKEYCODE_BROWSER = 220,
- }
4、/frameworks/base/include/androidfw/KeycodeLabels.h
這裏定義的其實是咱們在kl文件,也就是linux key到android key的一個映射表中的linux鍵值和android鍵值的名稱;
好比frameworks/base/data/keyboards/Generic.kl:
……
key 217 BROWSER //這裏的BROWSER就是咱們定義的android鍵值的字符形式,217則是linux鍵值
那麼,BROWSER不能平白無故就使用,必然有定義位置,這個位置就是KeycodeLabels.h數組
- static const KeycodeLabel KEYCODES[] = {
- ……
- { "CALCULATOR", 210 },
- {"BROWSER", 220}, //這裏的BROWSER就是咱們上面使用的東西,而220是android鍵值
- { NULL, 0}
- }
在EventHub.cpp中加載並解析這個map:frameworks/base/data/keyboards/Generic.kl,那麼獲得的是linux鍵值217爲key的string,這個string就是BROWSER,有了上面這個KEYCODES數組,就能夠得到它對應的android鍵值了。
5、/external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.happ
- enum ANPKeyCodes {
- ……
- kAppSwitch_ANPKeyCode = 186,
- kBrowser_ANPKEYCODE = 220,
- };
6、/frameworks/base/core/res/res/values/attrs.xmlui
<enum name="KEYCODE_YEN" value="216" />
<enum name="KEYCODE_RO" value="217" />
<enum name="KEYCODE_KANA" value="218" />
<enum name="KEYCODE_INTERCOM" value="220" />spa
這些操做完成了以後,就完成了linux鍵到android的鍵值映射。
也就是android中多了一個KEYCODE_BROWSER它的值是220.code
Linux部分簡單,就是在kernel/include/linux/input.h裏面加入#define BROWSER 217xml
而後在事件上報的時候,把217報上去就OK啦。