本文转载自:http://blog.csdn.net/mr_raptor/article/details/8053871

Android中,上层可使用的键值默认情况下是92个,从0-91;一般情况下,这些键值是够用的,但是如果想扩充的话,还是需要添加新的键值的,那么如何将一个新的键值从驱动的设置映射到上层,使应用可以对我们自定义的键值进行相应的处理呢?
         对keypad来说,涉及到的文件有以下几个:
        1,/vendor/qcom/7k_ffa_keypad.kl
               首先在此文件中,添加新的键值信息:Example: key   123    WLS   flag
              注意:新加的键值不要与已有的重复。
        2.  kernel/arch/arm/mach-msm/keypad_surf_ffa.c
              在keypad对应的键位添加自定义的键码  如 :123
       3.   frameworks/base/include/ui/keycodeLabels.h
               在数组keycodes 中添加 新定义的信息
                { "MUTE", 91 },  { "WLS" , 92 }
               枚举类型 KeyCode 中添加
                    kKeyCodeMute = 91
                    kKeyCodeWLS  = 92
       4.  frameworks/base/core/res/res/values/attrs.xml
                <enum name="KEYCODE_MUTE"  value="91"/>
               <enum name="KEYCODE_WLS" value="92" />
      5.   frameworks/base/core/Java/android/view/KeyEvent.java
              public static final int KEYCODE_MUTE          = 91;
              public static final int KEYCODE_WLS            = 92;
              注意:       private static final int LAST_KEYCODE    = KEYCODE_MUTE;
              应改为:   private static final int LAST_KEYCODE    = KEYCODE_WLS;
              
             在函数 public final boolean isSystem() 中,同样需要添加:

case KEYCODE_SEARCH:
                case KEYCODE_WLS:

//注意:现在(Android 2.3)这个函数调用的是frameworks\base\libs\ui\Input.cpp中的bool KeyEvent::isSystemKey(int32_t keyCode)
            //这里使用的按键定义在./development/ndk/platforms/android-9/include/android/keycodes.h
             通过以上的更改,新的键值就添加上去了,由于更改了 KeyEvent,影响到了API,
             所以需要make update-api
            
            如果对新键值进行处理,可以通过获取相应的keycode,对它进行处理;
            对于按键事件的处理一般如下文件中
    6.   frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java
       
          综上可知,我们可以根据需求定义自己的键值,并对键值所对应的事件信息进行合理化处理。

注:
7k_ffa_keypad.kl是专门给7k_ffa_keypad输入设备使用的keylayout文件,所以修改7k_ffa_keypad.kl 文件只是给键盘输入增加键值。如果是其他设备的输入,如x_input,而且当没有x_iput.kl存在的时候,那么默认的kl文件就是 qwerty.kl(android-root/development/emulator/keymaps/qwerty.kl)
这个很重要。也就是说需要实现明白添加的键值是否是7k_ffa_keypad的input event

我的理解:看了一下key character map的处理,是通过读取kcm文件然后使用驱动程序提供的ioctl函数去修改来自输入设备的扫描码和系统预定义的keycode的映射关系。 kl文件应该也可以这么理解。这样的话,对于硬件扫描码,只需要修改这个kl文件。上层得到的都是系统预定义的keycode。

重要补充:

映射关系:ir硬件扫描码在驱动里面被 映射为 kernel/include/Linux/input.h里面定义的某个键值。但是这个键值只在linux系统中使用。

Android通过源码目录下的device/xxx/xxx.kl( keylayout )文件完成linux键值到Android系统要使用的键值的映射

最新文章

  1. C#winForm调用WebService的远程接口
  2. ios 实现自定义状态栏StatusBar 和 导航栏navigationBar 的状态和颜色
  3. Java开发中经典的小实例-(输入三个数字判断三角形类型)
  4. Oracle数据库如何创建DATABASE LINK?
  5. 数据绑定时(&lt;%#Eval)单引号双引号嵌套问题
  6. 代码规范、代码复审、PSP
  7. JAVA 设计模式 外观模式
  8. spring mvc 详细配置(转)
  9. Unity3D深入浅出 - 新版粒子系统 (Shuriken) - Tonge
  10. 学习笔记之AJAX无刷新分页
  11. 类型兼容原则(C++)
  12. 单选按钮、复选按钮——axure线框图部件库介绍
  13. 使用(Drawable)资源——图片资源
  14. Servlet Cookie取不到值原因
  15. C# 入门经典
  16. 剖析项目多个logback配置(下)
  17. Python中字典dict
  18. Annotaion——深入理解注解类型
  19. Jmeter中自动重定向与跟随重定向的区别
  20. 获取微信小程序源码

热门文章

  1. C#Cookie操作类,删除Cookie,给Cookie赋值
  2. 5.26 Quartz任务调度图解2
  3. springBoot jar/war打包部署问题
  4. Vue初级-样式
  5. SqlServer 导出指定表数据 生成Insert脚本
  6. 【Oracle】to_char技巧
  7. SQLite 在 Android 的应用
  8. 连接Oracle数据库帮助类
  9. kerberos认证原理---讲的非常细致,易懂
  10. Restrictions.like(&quot;字段field&quot;,&quot;%表达式exp%&quot;);