Android4.2增長新鍵值

  這裏添加新的鍵值,不是毫無憑據憑空創造的一個鍵值,
  而是根據kernel中檢測到的按鍵值,而後轉化爲android所須要的數值:
  以添加一個linux鍵值爲217,把它映射爲android的鍵值Browser(這個鍵值以前不存在)爲例介紹一下:
  1、android以前沒有這個鍵值,須要定義
  /frameworks/base/core/java/android/view/KeyEvent.java
  //定義這個新的鍵值
  public static final int KEYCODE_BROWSER = 220;(在我這套代碼裏已經最大是219了,因此咱們新加一個定義爲220)
  而後咱們會看到有以下注釋:java

  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,由於添加了新的,因此須要更改這個的數值linux

  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.   }

  上面的註釋已經爲咱們指明瞭添加鍵值所須要的步驟:
  2、/frameworks/base/core/java/android/view/KeyEvent.javaandroid

  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.   }

  3、/frameworks/native/include/android/keycodes.hweb

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

  4、/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鍵值了。
  5、/external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.happ

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


  6、/frameworks/base/core/res/res/values/attrs.xmlui

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

 

  這些操做完成了以後,就完成了linux鍵到android的鍵值映射。
  也就是android中多了一個KEYCODE_BROWSER它的值是220.code

  

  Linux部分簡單,就是在kernel/include/linux/input.h裏面加入#define BROWSER            217xml

  而後在事件上報的時候,把217報上去就OK啦。

相關文章
相關標籤/搜索