以添加 camera按鍵為例(紅色是需要添加的)
一、kernel鍵值定義
(1)鍵掃描碼
ScanCode是由linux的Input驅動框架定義的整數類型,可參考input.h頭文件,即getevent得到的鍵值。
#define KEY_Q 16
#define KEY_W 17
#define KEY_E 18
#define KEY_R 19
#define KEY_T 20
#define KEY_CAMERA 199
(2)鍵盤布局文件(*.kl)
將input event報的鍵值轉換成具體鍵盤對應的按鍵供android上層使用,時通過鍵盤布局文件(*.kl)完成轉換的。放在/system/usr/keylayout/下面
而qwert.kl中定義如下:
ScanCode + 字符串值
key 16 Q
key 17 W
key 18 E
key 19 R
key 20 T
其中ScanCode 是驅動報的值(即驅動input.h中定義的鍵值 )
A:添加kl文件:
abcxxxx.kl(文件名須與input 的device設備的name一致)
Key 199 CAMERA
【199為 驅動定義的scanCode ,CAMERA 為Android中 KEYCODES[]定義按鍵對應的keylabel字符】
注:
1)kl文件須與鍵盤輸入的input 的devic 的名稱一致,否則EventHub在加載設備時因找不到對應的kl 而加載默認的qwert.kl,導致鍵值轉換錯誤
2)kl中的scanCode 和android 中定義的keylabel字符必須對應,否則會轉換錯誤。keyMapper在轉換時是根據scanCode,來確定對應的按鍵字符,再根據此字符在KEYCODES中的位置來確定對應android中的鍵值。
B:kl文件添加到system
將kl文件(通常)放在/device/qcom/XXX/(XXX為項目名稱)
(1) AndroidBoard.mk 添加:
include $(CLERA_VARS)
LOCAL_MODULE := abcxxxx.kl
LOCAL_MODULE_TARGS := optional eng
LOCAL_MODULE_CLASS := ETC
LOCAL_SRC_FILES := $(LOCAL_MODULE)
LOCAL_MODULE_PATH := $(TARGET_OUT_KEYLAYOUT)
include $(BUILD_PREBUILT)
(2)/device/qcom/common/base.mk添加
KEYPAD += abcxxxx.kl
注:不加會導致kl文件不被打包進/system/usr/keylayout/
二、Android 中添加按鍵
(1)定義按鍵對應的key label
在KEYCODES[]數組的最后添加按鍵的key label,
即:
static const KeycodeLabel KEYCODES[] = {
…
DEFINE_KEYCODE(HELP)
DEFINE_KEYCODE(CAMERA )
};
注:
位置
Android 4.4 以前版本 frameworks/base/include/ui/KeycodeLabels.h
Android 4.4 在framework/native/include/input/KeyCodelabels.h
Android5.0 以后在framework/native/include/input/InputEventLabels.h
(2)定義keyCode
A: native 定義(keycodes.h)
enum {
………
AKEYCODE_HELP = 259,
AKEYCODE_CAMERA = 260
};
注:
1)位置:frameworks/base/include/android/keycodes.h
2)此處keycode的定義的值即是 上面key label定義在KEYCODES數組中的位置(index),否則會映射錯誤
B:JAVA 定義(KeyEvent.java定義鍵值)
public static final int KEYCODE_HELP = 259;
public static final int KEYCODE_CAMERA = 260;
修改LAST_KEYCODE
private static final int LAST_KEYCODE = KEYCODE_CAMERA;
注:
1)位置:frameworks/base/core/java/android/view/KeyEvent.java
2)此處的key code必須與native定義的一致
C:資源文件(attrs.xml)添加keycode
注:
1)位置:frameworks\base\core\res\res\values\attrs.xml
影響到API則需要調用 make update-api 然后就可以使用了。
三、問題debug
按鍵映射出錯或 unknown,排查步驟如下:
- 用 getevent 確認驅動是否報按鍵值,是否正確
- 看kl文件名是否正確?【參見1.2.A】
- 看kl文件是否正確加載,dumpsys input 查看KeyLayoutFile是否正確
- 看native定義的key code是否與key label 在KEYCODES[]數組的位置對應
- 看java層key code定義是否與native定義一致
dumpsys input 看 KeyLayoutFile如下:
2:abcxxxx
Classes: 0x00000001
Path: /dev/input/event7
Descriptor: 0ea3e722ddb6fa78cd53a54fc262828fb3df6ca7
Location: ALSA
ControllerNumber: 0
UniqueId:
Identifier: bus=0x0000, vendor=0x0000, product=0x0000, version=0x0000
KeyLayoutFile: /system/usr/keylayout/abcxxxx.kl
KeyCharacterMapFile: /system/usr/keychars/Generic.kcm
ConfigurationFile:
HaveKeyboardLayoutOverlay: false