本文转载自: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系统要使用的键值的映射

android 添加新的键值,自定义按键【转】的更多相关文章

  1. android 添加新的键值,自定义按键-2【转】

    本文转载自:http://blog.csdn.net/mr_raptor/article/details/8053871 在Android中,上层可使用的键值默认情况下是92个,从0-91:一般情况下 ...

  2. Android下添加新的自定义键值和按键处理流程

            Android下添加新的自定义键值和按键处理流程     说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我 ...

  3. Android下添加新的自定义键值和按键处理流程【转】

    本文转载自: Android下添加新的自定义键值和按键处理流程     说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我一 ...

  4. Android无线测试之—KEYCODE键值对应大全

    KEYCODE列表电话键键名 描述 键值 KEYCODE_CALL 拨号键5    KEYCODE_ENDCALL 挂机键6    KEYCODE_HOME 按键Home3    KEYCODE_ME ...

  5. Android添加新按键

    1.前言 在Android开发中可能会遇到添加新的按键的需求,本文将简单介绍如何在Android系统中完成一个新的按键的添加. 当系统有新的按键需要添加时,Linux内核下的键码到Android系统中 ...

  6. android sp文件一个键值保存多条信息

    之前碰到过这样的问题,sp文件只能够append,或者清空.其实一个键值,通过,分割,或者替代可以实现多条信息的存储.下面是一个举例: package com.ctbri.weather.utils; ...

  7. GeneratedKeyHolder的作用:获得新建主键值

    Spring利用GeneratedKeyHolder,提供了一个可以返回新增记录对应主键值的方法: int update(PreparedStatementCreator psc, KeyHolder ...

  8. cocos2d-x android 添加新场景报错: undefined reference to `vtable for XXX'

    转载自 居家懒人 http://www.cnblogs.com/JD85/archive/2012/09/17/2688128.html 加入写了新场景SecondScene,结果在cpp文件里类名地 ...

  9. Android 添加新的Activity

    1.右键, New一个Class ,文件名如:ParaSetActivity.java 注: Superclass要选择android.app.Activity ,没有直接写入android.app. ...

随机推荐

  1. spring 九种设计模式

    spring中常用的设计模式达到九种,我们举例说明: 第一种:简单工厂 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式的实质是由一 ...

  2. SQLServer外部数据导入--Excel版

    例如要在test表里插入多行数据 假设字段有: ID.Name 首先要有需要导入的数据的Excel A1 对应ID B1 对应Name 选中Excel第一行的空白处,比如C1,在工具栏的函数文本框里输 ...

  3. OpenCV : 基于切线方向的边缘增强算法

    使用切线方法,对切线方向上的边缘进行强化: 参考连接:图像锐化和边缘检测 代码: //在种子点方向上寻找合适的梯度,用于寻找边缘 //对low_Gray, high_gray之间的点寻找边缘 void ...

  4. 点云处理软件Pointscene

    转载于PCL中国:点云处理软件Pointscene 软件官网:https://pointscene.com/ 笔者评:        Pointscene是目前的点云处理软件之一,其主要是操作简单直观 ...

  5. css3基础篇二

    CSS3 边框 border-radius box-shadow border-image(ie不支持) 语法 border-radius: 1-4 length|% / 1-4 length|%; ...

  6. ssl_protocols和ssl_ciphers应该怎么配置

    http://wiki.nginx.org/HttpSslModule#ssl_ciphers 推荐配置: A) 在Apache 的 SSL 配置中禁用 SSLv3 和 SSLv3SSLProtoco ...

  7. 简单servlet调用dao层完整步骤

    导入包lib(文件名称) 目录结构:web下:views.web-inf.index.jsp views下各种jsp文件和js(里面放封装好的jquery包) js下:jquery包(js文件后缀) ...

  8. Shell 环境变量也是变量

    跟定义普通变量一样,语法是 变量名=值,只不过这个名字叫 PATH,值是路径 shell PATH=/usr/local/python-2.7.6/bin 导入的话使用export命令 shell e ...

  9. shell 结合expect实现ssh登录并执行命令

    #!/bin/bash ips=( '127.0.0.1' ) ;i<${#ips[*]};i++)) do expect <<EOF #这里的 expect <<EOF ...

  10. eas之动态刷新Table

    如何刷新表体数据行(表头不变) 示例1:删除所有表体行,并重新发取数事件该方法不会修改原先的绑定信息table.removeRows(); 示例2:删除所有表体行,修改绑定信息并重新取数指定新的que ...