keycode是android定义好的,但是有时候无法满足需要,进行定制化难免会涉及到新增加keycode。分成两部分,驱动和framework,这里主要讲解framework部分:

一、驱动部分:

1. 在下列文件中定义

如KEY_SMS

#defineKEY_SMS 252

可能涉及的文件(可能还需要在别的文件):

kernel\include\linux\input.h

bionic\libc\kernel\common\linux\input.h

external\kernel-headers\original\linux\input.h

external\qemu\linux_keycodes.h


2.增加keypad layout文件键盘映射,linuxandroidkey映射

如:

key 252 SMS

注意所用版本和项目使用的KL文件,在adbshell中进入system/usr/keylyout/可以看到所用的KL,可以修改确认使用的KL

一般定义在kpd.c 的新按键会使用***-kpd.kl,也就是注册input设备为***-kpd的会使用***-kpd.kl

新增加设备名称的时候一般会使用generic.kl和qwerty.kl

generic.kl和qwerty.kl在alps/frameworks/base/data/keyboards/

***-kpd.kl在config/<projectname>/

其中252 是linux键码,SMS是android识别key值 如果是需要唤醒系统,还需要增加WAKE


二、framework部分

1.修改Java识别keycode

framework/native/include/input/KeyCodelabels.h

KEYCODES数据结构后面增加

{"SMS",220}

framework/native/include/android/KeyCodes.h

在按键定义项增加AKEYCODE_SMS = 220;

2.修改Java 键盘事件

framework/base/core/java/android/view/keyevent.java

/**

*@hide

*/

public static final int KEYCODE_SMS=220;

最后的按键为新增的

private static final int LAST_KEYCODE==KEYCODE_SMS;

以上/**/注释的code是android 非开放API或变量定义的时候,需要添加Java Doc的识别,否则要运行make update-api才能build通过


在KEYCODE_SYMBOLIC_NAMES 中增加name.append(KEYCODE_SMS, "KEYCODE_SMS");

如果是系统按键,修改framework/base/libs/ui/input.cpp

isSystemKey()增加case AKEYCODE_SMS:

3.修改XML文件描述符framework/base/core/res/res/values/attr.xml

<enum name="KEYCODE_SMS"value="220" />

4.增加测试验证log在android

framework\base\policy\src\com\android\internal\polidy\impl\phoneWindowManager.java

在interceptKeyBeforeDispatching()增加

if(keycode== KeyEvent.KEYCODE_SMS){

log.d(TAG, "interceptKeyTiKEYCODE_SMSkeyCode="+ keyCode + " down=" + down + "repeatCount=" + repeatCount + “ keyguardOn=” + keyguardOn + “mHomePressed=” + mHomePressed + “ cancled=” + canceled)


p.s.并不是所有的linux keycode framework都会支持处理,如果您需要增加很多按键,就可能超出256(如Touch Panel的手势识别会用到很到键)

inputreader.cpp的KeyboardInputMapper这个class的process函数会先判断是否是isKeyboardOrGamepadKey. 这里面会对按键的大小进行判断,条件是: 1.小于272 2.大于352 3.大于等于256且小于272 4.大于等于288且小于320 满足其一即可。 否则会拦截掉,不会往inputDispatcher和phonewindowmanager.java走

按照以上步骤修改代码,即可在android系统中增加一个新的keycode。


更多相关文章

  1. android 4.0.3编译 总结
  2. android 混淆时出现的一些问题
  3. (二)在Android硬件抽象层增加接口模块访问硬件驱动程序
  4. 修改android4.2系统源码实现system组和root用户访问sd卡
  5. Android(安卓)Studio的使用第一篇优化篇
  6. android spinner点击android.view.WindowManager$BadTokenExcept
  7. 右侧滑出式提示框改良
  8. android移除数据
  9. Android高通平台下编译时能生成(拷贝)预编译的so到system的lib目

随机推荐

  1. Android中有关Handler的使用(二)
  2. Android代码风格指导
  3. Your project contains error(s),please f
  4. Android跟软键盘的故事
  5. android 动态调试笔记
  6. Android 横竖屏的锁定
  7. ArcGIS API For Android离线地图的实现
  8. 二级菜单---ExpandableListView
  9. Android三种库的区别:pravite libraries、
  10. Android 中各种XML文件的作用