zoukankan      html  css  js  c++  java
  • Android4.2增加新键值

      这里添加新的键值,不是毫无凭据凭空创造的一个键值,
      而是根据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啦。
     

  • 相关阅读:
    一个想法开发与业务,我们互相依赖
    vs2005中文包,和sqlserver2005中文开发版
    C中的指针
    建立一个新的web Site
    Visual Studio 2005 中的新增安全性功能
    htm和html的区别
    完美实现导航滑动功能
    如何避免AJAX的缓存问题
    两个常用的稳定的远端CDN jquery
    推荐一个CSS排错的网址
  • 原文地址:https://www.cnblogs.com/rzq232/p/3640902.html
Copyright © 2011-2022 走看看