Android 增加(鍵盤)按鍵


 

以添加 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字符】

注:

1kl文件須與鍵盤輸入的input devic 的名稱一致,否則EventHub在加載設備時因找不到對應的kl 而加載默認的qwert.kl,導致鍵值轉換錯誤

2kl中的scanCode android 中定義的keylabel字符必須對應,否則會轉換錯誤。keyMapper在轉換時是根據scanCode,來確定對應的按鍵字符,再根據此字符在KEYCODES中的位置來確定對應android中的鍵值。

 

Bkl文件添加到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),否則會映射錯誤

 

BJAVA 定義(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

 

     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM