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

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 中自定义属性(attr.xml,TypedArray)的使用!
  2. Android 自定义view组件
  3. android自定义按钮按下效果
  4. android listview每个item定义动画呈现
  5. Android shape自定义button样式
  6. 自定义VIEWGROUP的一个用法
  7. Android 自定义 LinearLayout
  8. Android 自定义Animation,使用Camera对View组件作三维变换
  9. android 自定义view 不执行 ondraw的解决办法

随机推荐

  1. android DecorView的使用
  2. Android怎样添加AT命令
  3. 利用drozer进行Android渗透测试
  4. android调用js
  5. Android(安卓)自定义Listview 如何绑定Sq
  6. 【Android】进程通信IPC——ContentProvi
  7. 零点起飞学Android开发
  8. Android7关闭selinux(设置为Permissive模
  9. Android(安卓)Jetpack Components of Lif
  10. Android中关于FTP的文件上传和下载