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文件键盘映射,linux和androidkey映射

如:

key   252   SMS

注意所用版本和项目使用的KL文件,在adb shell中进入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, "interceptKeyTi KEYCODE_SMS keyCode="+ 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。

在Android4.4上新增加keycode的更多相关文章

  1. CAN网络上新增加的设备与网络上已有设备MAC地址冲突的软件解决方案

    已知 1号的CAN节点的地址是0x1f 2号的CAN 节点的地址是0x1f 要达到的要求是 假设 网络上 CAN1 节点已经工作了,我现在需要在网络上接入CAN2节点. 那么CAN2节点首次上电的时候 ...

  2. Solaris10上如何识别新增加的HDLM LUN

    先在磁盘阵列上将新加LUN映射给主机组,然后在光纤交换机上增加相关zone信息.以下是Solaris10上需要执行的操作步骤. 在Solaris10上重新扫描磁盘 -bash-3.2# cfgadm ...

  3. [原创] Easy SysLite V1.2 (2016.5.29更新,新增加WIN10支持,一个程序适配所有系统减肥)

    [原创] Easy SysLite V1.2 (2016.5.29更新,新增加WIN10支持,一个程序适配所有系统减肥) nohacks 发表于 2016-5-29 17:12:51 https:// ...

  4. css3新增加的选择器

    css3新增加的选择器 一.属性选择器: E[attr] 只要有属性名E[attr=value] 属性名=属性值E[attr~=blue] 包含这个blue整个单词就可以E[attr^=c] 以这个字 ...

  5. ECMAScript6标准新增加的内容

    首选呐,你得了解一下javascript和ECMAScript的关系: 编程语言JavaScript是ECMAScript的实现和扩展,由ECMA(一个类似W3C的标准组织)参与进行标准化.ECMAS ...

  6. debian新增加用户 拥有ROOT权限

    方案一 : 已经有了 新增加的用户  但是没有ROOT 权限: 首需要切换到root身份$su -(注意有- ,这和su是不同的,在用命令"su"的时候只是切换到root,但没有把 ...

  7. 在Android系统中修改Android.mk使其同时编译rgb2565和rgb2888(向out/host/linux-x86/bin/下新增加一个工具命令)【转】

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7514559 在Android系统中修改android.mk使其同时编译rgb2565和rgb ...

  8. HTML5每日一练之input新增加的六种时间类型应用

    今天介绍一下input在HTML5中新增加的时间类型的应用,与昨天的练习一样,如果在以下这几种输入框中输入的格式不正确,也是无法提交的. 注意:此种类型的input在Opera10+中效果为佳,Chr ...

  9. 五种情况下会刷新控件状态(刷新所有子FWinControls的显示)——从DFM读取数据时、新增加子控件时、重新创建当前控件的句柄时、设置父控件时、显示状态被改变时

    五种情况下会刷新控件状态(刷新控件状态才能刷新所有子FWinControls的显示): 在TWinControls.PaintControls中,对所有FWinControls只是重绘了边框,而没有整 ...

随机推荐

  1. Linux下不同机器之间的文件拷贝

    通过 scp 命令实现不同机器之间的文件拷贝. (1)本机考到目标机器:scp 本机文件 目的地: 如:scp /home/odp-web.war   root@192.168.6.137:/usr/ ...

  2. 创建gbk编码

        NSStringEncoding gbkEncoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_1803 ...

  3. Windows 下安装项目管理工具 Redmine 1.1.2

    1.InstantRails-2.0-win 下载地址  https://rubyforge.org/frs/?group_id=904 2.redmine1.1.2 下载地址  http://www ...

  4. Visual Studio Online Integrations-Collaboration

                                                                                         原文:http://www.v ...

  5. VO(DTO)模式在架构设计中是否需要

    DTO(VO):也就是一般意义上的VO,封装后的对象.一般用于Web层—Service层间的数据传输入. PO:也就是一般概念上的Domain Object,如hibernate 中的Entity.一 ...

  6. win7下virtualbox装linux共享win7文件问题(已测试可用)

    virtualbox这个比较强大,在win7上跑redhat5u4很流畅.os之间共享文件是个大家都很关心的问题,这会直接关系到虚拟机用的爽不爽. 在win7和其上的虚拟机linux之间共享文件也很容 ...

  7. [Asp.net Mvc]通过UrlHelper扩展为js,css静态文件添加版本号

    写在前面 在app中嵌入h5应用,最头疼的就是缓存的问题,比如你修改了一个样式,或者在js中添加了一个方法,发布之后,并没有更新,加载的仍是缓存里面的内容.这个时候就需要清理缓存才能解决.但又不想让w ...

  8. asp.net缓存(转)

    转自:http://www.cnblogs.com/knowledgesea/archive/2012/06/20/2536603.html 一.缓存概念,缓存的好处.类型.            缓 ...

  9. jQuery类库的设计

    目前为止,jquery是js社区中最活跃.用户最多的前端类库,具有链式操作.兼容性.基于数组的操作.强大的插件机制等特点,也是很多前端入门同学最早接触到的库.但是内部如何实现的,一直吸引着我.因此最近 ...

  10. Java EE学习——Quartz的Cron表达式

    经历过低谷后,还是要好好学习,越失落会越来越落后. 今天写一下Cron表达式的用法,虽然是之前自己写的,也过了挺长一段时间,这次就拿出来作为回顾吧. Cron表达式是Quartz的精髓(个人觉得),比 ...