本文转载自:http://developer.t-firefly.com/thread-251-1-1.html

网上存在一些关于Android系统添加自定义按键的文章,但大多针对Android2.3和4.0系统的,许多文件都已经变动位置了,这两天我总结了一些,写出来欢迎大家交流与指正:

Android系统通过*.kl文件将Linux按键传给上层,最新的Android4.4已经不再默认qwerty.kl文件了,代之的是frameworks/base/data/keyboards/Generic.kl文件,当然如果定义板级键值文件,还是以rk29-keypad.kl文件优先。

    在3288/device/rockchip/rksdk目录下的rk29-keypad.kl文件中有相关键值的定义:
  1. key 59    MENU
  2. key 102   HOME
  3. key 114   VOLUME_DOWN
  4. key 115   VOLUME_UP
  5. key 116   POWE                WAKE
  6. key 143   NOTIFICATION       WAKE
  7. key 158   BACK
  8. key 212   CAMERA
  9. key 217   SEARCH

复制代码

 
说明:
WAKE: 当设备睡眠时按下此键,设备将被唤醒,按键事件将会被发送到应用程序。
WAKE_DROPPED: 当设备睡眠时按下此键,设备将被唤醒,而按键事件不会被发送到应用程序。
       瑞星微的按键分为GPIO和ADC两种,定义在/kernel/arch/arm/boot/dts目录下的firefly-rk3288.dts文件:
  1. &adc {
  2. status = "okay";
  3. key {
  4. compatible = "rockchip, key";
  5. io-channels = <&adc 1>;
  6. vol-up-key {
  7. linux, code = <115>;
  8. label = "volume up";
  9. rockchip, adc_value = <1>;
  10. };
  11. vol-down-key {
  12. linux, code = <114>;
  13. label = "volume down";
  14. rockchip, adc_value = <170>;
  15. };
  16. power-key {
  17. gpios = <&gpio0 GPIO_A4 GPIO_ACTIVE_LOW>;
  18. linux, code = <116>;
  19. label = "power";
  20. gpio-key, wakeup;  // 具有唤醒功能
  21. };
  22. menu-key {
  23. linux, code = <139>;
  24. label = "menu";
  25. rockchip, adc_value = <355>;
  26. };
  27. home-key {
  28. linux, code = <102>;
  29. label = "home";
  30. rockchip, adc_value = <746>;
  31. };
  32. back-key {
  33. linux, code = <158>;
  34. label = "back";
  35. rockchip, adc_value = <560>;
  36. };
  37. camera-key {
  38. linux, code = <212>;
  39. label = "camera";
  40. rockchip, adc_value = <450>;
  41. };
  42. };

复制代码

       先在linux内核中添加新的按键值(当然不用宏定义直接写数值也可以),网上一般写在/include/linux/input/input.h文件中添加,实际3.10内核在/include/uapi/ linux/input.h文件中:
#defineKEY_RESERVED     0
#define KEY_ESC         1
#define KEY_1           2
...
#defineKEY_MY           250
      对于Android层次,在rk29-keypad.kl文件中增加按键值后,还需要修改一些文件,系统才能处理,首先修
改KeycodeLabels.h文件,4.4版本将其移到了frameworks/native/include/input目录下,对KEYCODES数组添加按键码:
static const KeycodeLabelKEYCODES[] = {
  ...
  { "MY_KEYS" ,250},
  { NULL,0 }
          最后一定要以NULL结尾,其中的TV_KEYMOUSE_LEFT按键就是瑞星微添加的,再去frameworks/native/include/android/keycode.h文件中添加:enum {
   AKEYCODE_UNKNOWN         = 0,
    ....
    ....
添加
    AKEYCODE_MY_KEYS  =250,
       同样AKEYCODE_TV_KEYMOUSE_LEFT宏也是瑞星微添加的,如果要添加系统按键值,还需要修改
frameworks/base/libs/ui/input.java(android4.4已变为frameworks/native/libs/input/input.cpp)文件:
boolKeyEvent::hasDefaultAction(int32_t keyCode)
{
    switch (keyCode) {
        case AKEYCODE_HOME:
        case AKEYCODE_BACK:
        ...
        case AKEYCODE_MY_KEYS:
            return true;
        还有下面的:
boolKeyEvent::isSystemKey(int32_t keyCode) {
    switch (keyCode) {
        case AKEYCODE_MENU:
        ...
        case AKEYCODE_MY_KEYS:
            return true;
    }
        return false;
}
       还要修改frameworks/base/core/java/android/view/KeyEvent.java文件:
public staticfinal int KEYCODE_TV_MEDIA_PAUSE = 249;
public staticfinal int KEYCODE_MY_KEYS        = 250;
private staticfinal int LAST_KEYCODE = KEYCODE_MY_KEYS;
       注意一定要修改LAST_KEYCODE,下面的populateKeycodeSymbolicNames数组也需要添加:
names.append(KEYCODE_MY_KEYS, " KEYCODE_MY_KEYS ");
       修改frameworks/base/core/res/res/values/attr.xml文件:
<!--This enum provides the same keycode values as can be found in      
{@link android.view.KeyEvent}. --><attrname="keycode">
       <enum name="KEYCODE_UNKNOWN"value="0" />
       ...
       <enumname="KEYCODE_TV_MEDIA_PAUSE" value="249" />
       <enum name="KEYCODE_MY_KEYS" value="250" /></attr>
       对于网上说的/external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.h文件已经移除。
       以上文件都改完之后frameworks/base/api/current.txt也要随之更新,如果未更新,可运行 makeupdate-api 进行更新
       如果对新键值进行处理,可以通过获取相应的keycode,对它进行处理。对于按键事件的处理一般如下文件中:
frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@Override   
public intinterceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn)
{
  ...
  switch (keyCode) {
      case KeyEvent.KEYCODE_VOLUME_DOWN:
      ...
      case KeyEvent. KEYCODE_MY_KEYS:  // 添加处理代码

Android4.4.2系统添加自定义按键【转】的更多相关文章

  1. 在ubuntu14.04上编译android4.2.2系统

    原创作品,转载请注明出处,严禁非法转载             copyright:weishusheng   2015.8.1 时下android系统非常流行,下面就来说一下,下载编译一个andro ...

  2. 基于CentOS7系统添加自定义脚本服务及参数说明【转】

    概述 centos6如果要添加自定义脚本服务只需要把脚本放到/etc/init.d然后授权后用chkconfig添加后就可以管理了,那么centos7又是怎么添加自定义脚本服务呢? CentOS7添加 ...

  3. android2.3 -添加自定义按键:作唤醒功能 .

    最近需要做个唤醒功能,当按键的时候android系统唤醒并点亮屏,在长按键中,系统不能在进入睡眠. 驱动方面: 1:在平台设备文件中添加 一个按键,定义为唤醒源! \arch\arm\mach-s5p ...

  4. 【转】android4.1.1系统编译全过程

    原文网址:http://blog.csdn.net/hudan2714/article/details/7926924 一.编译环境: 首先介绍编译中使用的工具: 虚拟机:    vmare 9 下载 ...

  5. Android4.0-4.4 加入实体按键振动支持的方法(java + smali版本号)

    有些手机比方泛泰A820L, 泛泰A890 A900 以及Nubia Z5S 和Z5S mini具有实体按键(这里所说的实体按键是相对于虚拟按键而言, 包括物理按键和触摸屏上多出来的触摸实体按键), ...

  6. Android系统input按键处理流程(从驱动到framework)【转】

    本文转载自:http://blog.csdn.net/jwq2011/article/details/51234811 (暂时列出提纲,后续添加具体内容) 涉及到的几个文件: 1.out/target ...

  7. 深入浅出-Android系统移植与平台开发(一)- Android4.0系统的下载与编译

    作者:唐老师,华清远见嵌入式学院讲师. 一.Android4.0系统的下载与编译 Android系统的下载与编译,Google的官方网站上已经给出了详细的说明,请参照Android的官方网址: htt ...

  8. Android给自定义按键添加广播和通过广播给当前焦点输入框赋值

    一.给自定义按键添加广播 修改PhoneWindowManager.java中的interceptKeyBeforeDispatching方法 /frameworks/base/policy/src/ ...

  9. C++自定义修饰键,实现如<Capslock+J>等组合键的按键映射

    前:所谓修饰键,就是Ctrl,Alt,Shift,Win这些按键. Update: 我使用AHK写了一个功能更丰富的脚本:https://github.com/h46incon/ModifierCus ...

随机推荐

  1. 火狐插件youdao word capturer无法删除。

    []火狐插件youdao word capturer无法删除.       魔芋记录一下:   []一直无法删除,就网上找了下.   网上解释说是:有道词典自己安装的插件,所以火狐无法管理. 用来帮助 ...

  2. 大数据学习——mapreduce倒排索引

    数据 a.txt hello jerry hello tom b.txt allen tom allen jerry allen hello c.txt hello jerry hello tom 1 ...

  3. PTA 01-复杂度2 Maximum Subsequence Sum (25分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/663 5-1 Maximum Subsequence Sum   (25分) Given ...

  4. [Kubernetes]Volume

    容器技术使用rootfs机制和Mount Namespace,构建出一个同宿主机完全隔离开的文件系统环境 那容器里进程新建的文件,怎么样才能让宿主机获取到?宿主机上的文件和目录,怎么样才能让容器里的进 ...

  5. BZOJ 1022: [SHOI2008]小约翰的游戏John【anti-SG】

    Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取 ...

  6. Python基础教程笔记——第5章:条件,循环和其他语句

    5.1 print和import的更多信息 1. print()3.0之后print不再是语句,而是函数, >>> print('udg',12,13)   udg 12 13 &g ...

  7. 一段曲折的copy路程

    cp 的时候出现:-bash: /bin/cp: Argument list too longcp ./*.swf  /www/img/html/xxx/action/ 解决办法:find ./ -n ...

  8. python学习之 -- 数据序列化

    json / pickle 数据序列化 序列化定义:把变量从内存中变成可存储或传输的过程称为序列化.反序列化:把变量内容从序列化的对象重新读到内存里称为反序列胡. 序列化模块之--pickle使用注意 ...

  9. 【纯净版windows系统】U盘启动制作图文教程

    无废话,按照步骤来就可以. 1.一个大于4G的U盘(格式化)准备好U盘,请注意制作过程中对U盘有格式化操作,有用的东西请先备份 2.UltraISO(软碟通软件)下载安装百度“软碟通”,或者访问 ht ...

  10. CentOS7 设置系统时间

    在CentOS 6版本,时间设置有date.hwclock命令, 硬件时钟和系统时钟 (1) 硬件时钟 RTC(Real-Time Clock)或CMOS时钟,一般在主板上靠电池供电,服务器断电后也会 ...