android 添加一个新的android 键值
转载地址:
http://blog.csdn.net/kakaback/article/details/8115748
这里添加新的键值,不是毫无凭据凭空创造的一个键值,而是根据kernel中检测到的按键值,然后转化为android所需要的数值:
以添加一个linux键值为217,把它映射为android的键值Browser(这个键值之前不存在)为例介绍一下:
1、android之前没有这个键值,需要定义
/frameworks/base/core/java/android/view/KeyEvent.java
//定义这个新的键值
publicstaticfinalintKEYCODE_BROWSER=210;
然后我们会看到有如下注释:
//NOTE:Ifyouaddanewkeycodehereyoumustalsoadditto:
//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
//
//AlsoAndroidcurrentlydoesnotreservecoderangesforvendor-
//specifickeycodes.Ifyouhavenewkeycodestohave,you
//MUSTcontributeapatchtotheopensourceprojecttodefine
//thosenewcodes.Thisisintendedtomaintainaconsistent
//setofkeycodedefinitionsacrossallAndroiddevices.
上面的注释已经为我们指明了添加键值所需要的步骤:
2、/frameworks/base/core/java/android/view/KeyEvent.java
publicfinalbooleanisSystem(){
returnnative_isSystemKey(mKeyCode);
}
/frameworks/base/jni/android_view_KeyEvent.java
staticjbooleannative_isSystemKey(JNIEnv*env,jobjectclazz,jintkeyCode){
returnKeyEvent::isSystemKey(keyCode);
}
/frameworks/base/libs/ui/Input.cpp
boolKeyEvent::isSystemKey(int32_tkeyCode){
switch(keyCode){
……
caseAKEYCODE_BROWSER:
returntrue;
}
}
3、native/include/android/keycodes.h
/*
*Keycodes.
*/
enum{
……
AKEYCODE_CALCULATOR=210,
AKEYCODE_BROWSER =211,
}
4、frameworks/base/include/ui/KeycodeLabels.h
这里定义的实际上是我们在kl文件,也就是linuxkey到androidkey的一个映射表中的linux键值和android键值的名称;
比如atc260x-irkeypad.kl:
……
key217BROWSER //这里的BROWSER就是我们定义的android键值的字符形式,217则是linux键值
那么,BROWSER不能无缘无故就使用,必然有定义位置,这个位置就是KeycodeLabels.h
staticconstKeycodeLabelKEYCODES[]={
……
{"CALCULATOR",210},
{"BROWSER", 211}, //这里的BROWSER就是我们上面使用的东西,而211是android键值
{NULL,0}
}
在EventHub.cpp中加载并解析这个map:atc260x-irkeypad.kl,那么得到的是linux键值217为key的string,这个string就是BROWSER,有了上面这个KEYCODES数组,就可以获得它对应的android键值了。
5、external/webkit/WebKit/android/plugins/ANPKeyCodes.h
enumANPKeyCodes{
……
kAppSwitch_ANPKeyCode=186,
kBrowser_ANPKEYCODE=211,
};
6、frameworks/base/core/res/res/values/attrs.xml
<attrname="keycode">
<enumname="KEYCODE_CALCULATOR"value="210"/>
<enumname="KEYCODE_BROWSER"value="211"/>
</attr>
7、/frameworks/base/core/java/android/view/KeyEvent.java
LAST_KEYCODE也就是最后一个keycode,因为添加了新的,所以需要更改这个的数值
LAST_KEYCODE=KEYCODE_BROWSER
privatestaticfinal
SparseArray<String>KEYCODE_SYMBOLIC_NAMES=newSparseArray<String>();
privatestaticvoidpopulateKeycodeSymbolicNames(){
……
names.append(KEYCODE_MUSIC,"KEYCODE_MUSIC");
names.append(KEYCODE_CALCULATOR,"KEYCODE_CALCULATOR");
names.append(KEYCODE_BROWSER,"KEYCODE_BROWSER");
}
这些操作完成了之后,就完成了linux键到android的键值映射。也就是android中多了一个KEYCODE_BROWSER它的值是211.
后面我们会分析为什么这样添加。
更多相关文章
- ANDROID自定义SCROLLVIEW
- 《Gradle 权威指南》读书笔记——第八章 自定义Android Gradle
- Android ndk开发时查看编译器预定义宏
- Android 在 xml中定义图片
- Android 如何在XML文件中定义动画
- Android去除标题栏及自定义title栏
- Android 自定义View(手写签名)
- android中自定义播放器的实现
- Android 选择器 PickerView实例,时间选择器、地址选择器、单项选