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. hdu 2046 骨牌铺方格

    #include<stdio.h> int main(void) { long long i,n,narr[55]; narr[1]=1;narr[2]=2;narr[3]=3; for( ...

  2. php 命名空间

    命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀. 例:项目中有两个 ...

  3. 自定义 SqlHelp

    using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Data; usin ...

  4. Hbase can't get locations问题

    2016-11-08 22:21:16,875 ERROR [main-SendThread(ht-lxfx-01:24002)] client.ZooKeeperSaslClient: An err ...

  5. iOS-Auto property synthesis will not synthesize property 'delegate'; it will be implemented by its super

    今天在XCode6.3上面重写TabBar的时候,自定义tabBar的代理遇到的一个问题 在重写tabBar的代理的时候遇到了一个警告. 解决方法: 在.m文件中 警告消失.

  6. 最长不下降子序列(LIS)

    最长上升子序列.最长不下降子序列,解法差不多,就一点等于不等于的差别,我这里说最长不下降子序列的. 有两种解法. 一种是DP,很容易想到,就这样: REP(i,n) { f[i]=; FOR(j,,i ...

  7. mysql 启动 导入sql文件

    mysql mysqld.exe mysqld.exe 是mysql的服务器进程,只有先启动这个进程才能连接服务器 dos下进入mysql文件目录下的bin目录,输入mysql -u root -p ...

  8. cocos基础教程(5)数据结构介绍之cocos2d::Vector

    cocos2d::Vector cocos2d::Vector<T>是一个封装好的能动态增长顺序访问的容器.cocos2d::Vector<T>中的元素是按序存取的,它的低层实 ...

  9. linux配置ant

    第1步:下载ant ,地址:http://ftp.twaren.net/Unix/Web/apache//ant/binaries/apache-ant-1.9.6-bin.tar.gz apache ...

  10. 淘宝(阿里百川)手机客户端开发日记第六篇 Service详解(六)

    Service和Thread的关系 不少初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread? 答案是Service和T ...