这里添加新的键值,不是毫无凭据凭空创造的一个键值,
  而是根据kernel中检测到的按键值,然后转化为android所需要的数值:
  以添加一个linux键值为217,把它映射为android的键值Browser(这个键值之前不存在)为例介绍一下:
  一、android之前没有这个键值,需要定义
  /frameworks/base/core/java/android/view/KeyEvent.java
  //定义这个新的键值
  public static final int KEYCODE_BROWSER = 220;(在我这套代码里已经最大是219了,所以我们新加一个定义为220)
  然后我们会看到有如下注释:

  1.   // NOTE: If you add a new keycode here you must also add it to:
  2.   // isSystem()
  3.   // native/include/android/keycodes.h
  4.   // frameworks/base/include/ui/KeycodeLabels.h
  5.   // external/webkit/WebKit/android/plugins/ANPKeyCodes.h
  6.   // frameworks/base/core/res/res/values/attrs.xml
  7.   // emulator?
  8.   // LAST_KEYCODE
  9.   // KEYCODE_SYMBOLIC_NAMES
  10.   //
  11.   // Also Android currently does not reserve code ranges for vendor-
  12.   // specific key codes. If you have new key codes to have, you
  13.   // MUST contribute a patch to the open source project to define
  14.   // those new codes. This is intended to maintain a consistent
  15.   // set of key code definitions across all Android devices.

  LAST_KEYCODE也就是最后一个keycode,因为添加了新的,所以需要更改这个的数值

  1.   LAST_KEYCODE = KEYCODE_BROWSER
  2.   private static final
  3.   SparseArray KEYCODE_SYMBOLIC_NAMES = new SparseArray();
  4.   private static void populateKeycodeSymbolicNames() {
  5.   ……
  6.   names.append(KEYCODE_MUSIC, "KEYCODE_MUSIC");
  7.   names.append(KEYCODE_CALCULATOR, "KEYCODE_CALCULATOR");
  8.   names.append(KEYCODE_BROWSER, "KEYCODE_BROWSER");
  9.   }

  上面的注释已经为我们指明了添加键值所需要的步骤:
  二、/frameworks/base/core/java/android/view/KeyEvent.java

  1.   public final boolean isSystem() {
  2.   return native_isSystemKey(mKeyCode);
  3.   }
  4.   /frameworks/base/jni/android_view_KeyEvent.java
  5.   static jboolean native_isSystemKey(JNIEnv* env, jobject clazz, jint
  6. keyCode) {
  7.   return KeyEvent::isSystemKey(keyCode);
  8.   }
  9.   /frameworks/base/libs/androidfw/Input.cpp
  10.   bool KeyEvent::isSystemKey(int32_t keyCode) {
  11.   switch (keyCode) {
  12.   ……
  13.   case AKEYCODE_BROWSER:
  14.   return true;
  15.   }
  16.   }

  三、/frameworks/native/include/android/keycodes.h

  1.   /*
  2.   * Key codes.
  3.   */
  4.   enum {
  5.   ……
  6.   AKEYCODE_CALCULATOR = 210,
  7.   AKEYCODE_BROWSER = 220,
  8.   }

  四、/frameworks/base/include/androidfw/KeycodeLabels.h
  这里定义的实际上是我们在kl文件,也就是linux key到android key的一个映射表中的linux键值和android键值的名称;
  比如frameworks/base/data/keyboards/Generic.kl:
  ……
  key 217 BROWSER //这里的BROWSER就是我们定义的android键值的字符形式,217则是linux键值
  那么,BROWSER不能无缘无故就使用,必然有定义位置,这个位置就是KeycodeLabels.h

  1.   static const KeycodeLabel KEYCODES[] = {
  2.   ……
  3.   { "CALCULATOR", 210 },
  4.   {"BROWSER", 220}, //这里的BROWSER就是我们上面使用的东西,而220是android键值
  5.   { NULL, 0}
  6.   }

  在EventHub.cpp中加载并解析这个map:frameworks/base/data/keyboards/Generic.kl,那么得到的是linux键值217为key的string,这个string就是BROWSER,有了上面这个KEYCODES数组,就可以获得它对应的android键值了。
  五、/external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.h

  1.   enum ANPKeyCodes {
  2.   ……
  3.   kAppSwitch_ANPKeyCode = 186,
  4.   kBrowser_ANPKEYCODE = 220,
  5.   };

  六、/frameworks/base/core/res/res/values/attrs.xml

  <enum name="KEYCODE_YEN" value="216" />
  <enum name="KEYCODE_RO" value="217" />
  <enum name="KEYCODE_KANA" value="218" />
    <enum name="KEYCODE_INTERCOM" value="220" />

  这些操作完成了之后,就完成了linux键到android的键值映射。
  也就是android中多了一个KEYCODE_BROWSER它的值是220.

  

  Linux部分简单,就是在kernel/include/linux/input.h里面加入#define BROWSER            217

  然后在事件上报的时候,把217报上去就OK啦。
 

Android4.2增加新键值的更多相关文章

  1. Android4.0 添加一个新的Android 键值

    这里添加新的键值,不是毫无凭据凭空创造的一个键值,而是根据kernel中检测到的按键值,然后转化为Android所需要的数值: 以添加一个Linux键值为217,把它映射为android的键值Brow ...

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

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

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

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

  4. php 中 使用foreach为数组增加键值对

    php 中的 foreach 在php中,使用foreach来遍历数组的频率很高,并且其性能要高于 list() 和 each() 结合来遍历数组: 当遍历二位数组的第一层数组,并要给第二位数组增加一 ...

  5. Javascript对象数据类型(键值对)的创建和使用方法

    对象数据类型(键值对) 1.创建键值对 var arry={name:"小明",age:20,isgey:falet} // var 键值对名 = {键:值,键:值} 2.增加键值 ...

  6. RK3288 红外遥控器增加系统中已有的键值

    转载请注明出处:https://www.cnblogs.com/lialong1st/p/10066673.html CPU:RK3288 系统:Android 5.1 1.查看遥控器的用户码和键值, ...

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

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

  8. 一种历史详细记录表,完整实现:CommonOperateLog 详细记录某用户、某时间、对某表、某主键、某字段的修改(新旧值

    一种历史详细记录表,完整实现:CommonOperateLog 详细记录某用户.某时间.对某表.某主键.某字段的修改(新旧值). 特别适用于订单历史记录.重要财务记录.审批流记录 表设计: names ...

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

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

随机推荐

  1. nat模式、路由模式,网桥模式

    路由器的几种连接方式 NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Fo ...

  2. maven profile实现多环境打包

    快速解决: 项目目录 1.pom文件中添加profile <profiles> <profile> <!-- 本地开发环境 --> <id>dev< ...

  3. Lucene的多域查询、结果中查询、查询结果分页、高亮查询结果和结果评分

    1.针对多个域的一次性查询 1.1.三种方案     使用lucene构造搜索引擎的时候,如果要针对多个域进行一次性查询,一般来说有三种方法:     第一种实现方法是创建多值的全包含域的文本进行索引 ...

  4. Qt 学习之路:QSortFilterProxyModel

    从本章开始,我们将逐步了解有关自定义模型的相关内容.尽管前面我们曾经介绍过 Qt 提供的几个内置模型:QStringListModel和QFileSystemModel,但对于千变万化的需求而言,这些 ...

  5. Linux设备驱动编程之复杂设备驱动

    这里所说的复杂设备驱动涉及到PCI.USB.网络设备.块设备等(严格意义而言,这些设备在概念上并不并列,例如与块设备并列的是字符设备,而PCI.USB设备等都可能属于字符设备),这些设备的驱动中又涉及 ...

  6. 如何设置jsp默认的编码为utf-8

    方法一: 文件里写: <%@ page contentType="text/html; charset=UTF-8"  %> 方法二: 选择window –> P ...

  7. JS可控制的图片自动循环播放查看效果

    JS可控制的图片自动循环播放查看效果 <html> <head> <title>JS可控制的图片自动循环播放查看效果丨芯晴网页特效丨CsrCode.Cn</t ...

  8. Thinkphp 3.2及以上版本实现支付宝担保交易、即时到账接口类、函数和使用方法

    给客户开发网站时需要用到支付宝在线付款功能,小云到thinkphp网站溜了一圈,代码是有,可是都不怎么全,因此这篇文章诞生了! 本篇文章讲解了三个类的实现,担保交易.即时到账.双功能收款(该功能支付宝 ...

  9. Android 环境下编译FFmpeg

    Android 环境下编译FFmpeg 开发环境:Ubuntu 12.04.2 LTS , android-sdk-linux, android-ndk-r8e 一 .X264 编译 1.    X2 ...

  10. jquery属性选择器之 attr

    在温习jquery手册的时候,注意到这个,坐下记录. attr(name|properties|key,value|fn) 获取匹配的元素集合中的第一个元素的属性的值 或 设置每一个匹配的元素的一个或 ...