这里添加新的键值,不是毫无凭据凭空创造的一个键值,
而是根据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啦。