這里添加新的鍵值,不是毫無(wú)憑據(jù)憑空創(chuàng)造的一個(gè)鍵值,而是根據(jù)kernel中檢測(cè)到的按鍵值,然后轉(zhuǎn)化為android所需要的數(shù)值: 以添加一個(gè)linux鍵值為217,把它映射為android的鍵值Browser(這個(gè)鍵值之前不存在)為例介紹一下: 1、android之前沒(méi)有這個(gè)鍵值,需要定義 /frameworks/base/core/java/android/view/KeyEvent.java //定義這個(gè)新的鍵值 public static final int KEYCODE_BROWSER = 210; 然后我們會(huì)看到有如下注釋: // 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. 上面的注釋已經(jīng)為我們指明了添加鍵值所需要的步驟: 2、/frameworks/base/core/java/android/view/KeyEvent.java 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/ui/Input.cpp bool KeyEvent::isSystemKey(int32_t keyCode) { switch (keyCode) { …… case AKEYCODE_BROWSER: return true; } } 3、native/include/android/keycodes.h /* * Key codes. */ enum { …… AKEYCODE_CALCULATOR = 210, AKEYCODE_BROWSER = 211, } 4、frameworks/base/include/ui/KeycodeLabels.h 這里定義的實(shí)際上是我們?cè)?span style="font-family:Courier New">kl文件,也就是linux key到android key的一個(gè)映射表中的linux鍵值和android鍵值的名稱; 比如atc260x-irkeypad.kl: …… key 217 BROWSER //這里的BROWSER就是我們定義的android鍵值的字符形式,217則是linux鍵值
那么,BROWSER不能無(wú)緣無(wú)故就使用,必然有定義位置,這個(gè)位置就是KeycodeLabels.h static const KeycodeLabel KEYCODES[] = { …… { "CALCULATOR", 210 }, {"BROWSER", 211}, //這里的BROWSER就是我們上面使用的東西,而211是android鍵值 { NULL, 0} } 在EventHub.cpp中加載并解析這個(gè)map:atc260x-irkeypad.kl,那么得到的是linux鍵值217為key的string,這個(gè)string就是BROWSER,有了上面這個(gè)KEYCODES數(shù)組,就可以獲得它對(duì)應(yīng)的android鍵值了。 5、external/webkit/WebKit/android/plugins/ANPKeyCodes.h enum ANPKeyCodes { …… kAppSwitch_ANPKeyCode = 186, kBrowser_ANPKEYCODE = 211, }; 6、frameworks/base/core/res/res/values/attrs.xml <attr name="keycode"> <enum name="KEYCODE_CALCULATOR" value="210" /> <enum name="KEYCODE_BROWSER" value="211" /> </attr> 7、/frameworks/base/core/java/android/view/KeyEvent.java LAST_KEYCODE也就是最后一個(gè)keycode,因?yàn)樘砑恿诵碌?,所以需要更改這個(gè)的數(shù)值 LAST_KEYCODE = KEYCODE_BROWSER private static final SparseArray<String> KEYCODE_SYMBOLIC_NAMES = new SparseArray<String>(); private static void populateKeycodeSymbolicNames() { …… names.append(KEYCODE_MUSIC, "KEYCODE_MUSIC"); names.append(KEYCODE_CALCULATOR, "KEYCODE_CALCULATOR"); names.append(KEYCODE_BROWSER, "KEYCODE_BROWSER"); } 這些操作完成了之后,就完成了linux鍵到android的鍵值映射。也就是android中多了一個(gè)KEYCODE_BROWSER它的值是211.
后面我們會(huì)分析為什么這樣添加。 |
|