本文转载自: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. 开启远程MySQL

    安装完MySQL,由于安全原因默认是没有赋予用户远程权限的,所以第一步要首先赋予用户对应的权限 一  授权 mysql> mysql -u用户名 [-pIp地址] -p #登录 mysql> ...

  2. Asp.net MVC4 Step By Step(5)-使用Web API

    Web API是ASP.net MVC4新增的一个特色, 应用于处理Ajax请求, 他同时使用了Web标准规范, 比如Http, Json,和XML,以及一系列构建REST数据服务的参考原则, 和AS ...

  3. sql server 游标fetch简单用法

    //遍历tmp_check的年份和月份 DECLARE @year ) DECLARE @month ) DECLARE cur CURSOR FOR SELECT nf,yf FROM tmp_ch ...

  4. 人脸Pose检测:ASM、AAM、CLM总结

    人脸的Pose检测可以使用基于位置约束的特征点的方法.人脸特征点定位的目的是在人脸检测的基础上,进一步确定脸部特征点(眼睛.眉毛.鼻子.嘴巴.脸部外轮廓)的位置.定位算法的基本思路是:人脸的纹理特征和 ...

  5. webpack核心提炼

    基本是学习的时候在网上整理的资料,并非自己原创,这篇文章的的主要目的是记录webpack.config.js的配置方式.可能也有不少错误,欢迎指正!! 一.应用场景 前端模块化开发.功能拓展.css预 ...

  6. luogu P1714 切蛋糕 单调队列

    单调队列傻题. 考虑以 $i$ 结尾的答案 : $max(sumv_{i}-sumv_{j}),j \in [i-m,i-1]$ ($sumv_{i}$ 为前缀和) 稍微搞一搞,发现 $sumv_{i ...

  7. 【剑指Offer】28、数组中出现次数超过一半的数字

      题目描述:   数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.   例如:输入如下所示的一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过 ...

  8. 【剑指Offer】22、从上往下打印二叉树

      题目描述:   从上往下打印出二叉树的每个节点,同层节点从左至右打印.   解题思路:   本题实际上就是二叉树的层次遍历,深度遍历可以用递归或者栈,而层次遍历很明显应该使用队列.同样我们可以通过 ...

  9. CodeIgniter-CI之MySQL

    首先我们需要进行一下配置,这里需要修改的文件为application目录下的config目录下的database.php文件,我们修改相应的配置项,比如这里是我的配置情况: 通常我们在操作数据库之前, ...

  10. 洛谷P1057 传球游戏【递归+搜索】

    上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:nn个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把 ...