这是我转载的,原地址如下:

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;

}

}

3native/include/android/keycodes.h

/*

*Keycodes.

*/

enum{

……

AKEYCODE_CALCULATOR=210,

AKEYCODE_BROWSER =211,

}

4、frameworks/base/include/ui/KeycodeLabels.h

这里定义的实际上是我们在kl文件,也就是linuxkeyandroidkey的一个映射表中的linux键值和android键值的名称;

比如atc260x-irkeypad.kl

……

key217BROWSER //这里的BROWSER就是我们定义的android键值的字符形式,217则是linux键值

那么,BROWSER不能无缘无故就使用,必然有定义位置,这个位置就是KeycodeLabels.h

staticconstKeycodeLabelKEYCODES[]={

……

{"CALCULATOR",210},

{"BROWSER", 211}, //这里的BROWSER就是我们上面使用的东西,而211android键值

{NULL,0}

}

EventHub.cpp中加载并解析这个mapatc260x-irkeypad.kl,那么得到的是linux键值217keystring,这个string就是BROWSER,有了上面这个KEYCODES数组,就可以获得它对应的android键值了。

5、external/webkit/WebKit/android/plugins/ANPKeyCodes.h

enumANPKeyCodes{

……

kAppSwitch_ANPKeyCode=186,

kBrowser_ANPKEYCODE=211,

};

6frameworks/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.

更多相关文章

  1. android中圆角的bug
  2. Android系列教程之四:Android项目的目录结构
  3. Android(安卓)自定义view组件
  4. Android(安卓)中自定义属性(attr.xml,TypedArray)的使用!
  5. Android(安卓)ApiDemos示例解析(33):App->Preferences->Default V
  6. android listview每个item定义动画呈现
  7. android自定义按钮按下效果
  8. Android解决NDK not configured问题
  9. android跳转到微信小程序

随机推荐

  1. (4.1.23.1)Android(安卓)属性动画(Property
  2. 【区块链】Android通过Geth RPC接口实现
  3. APK反破解之一:Android(安卓)Java混淆(Pro
  4. Android启动器(Launcher)开发详解
  5. Android(安卓)UI效果之绘图篇(四)
  6. 解决Android(安卓)studio 2.3升级到Andro
  7. Android(安卓)Fragment学习笔记(一)
  8. Android(安卓)CTS 测试研究之二
  9. 大家帮忙看看简历
  10. import project后,出现Unable to get syst