1. 程式人生 > >android 新增新的鍵值,自定義按鍵

android 新增新的鍵值,自定義按鍵

在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系統要使用的鍵值的對映.

from here