在android4.4上新增加keycode

   keycode是android定義好的,但是有時候無法滿足需要,進行定製化難免會涉及到新增加keycode。分成兩部分,驅動和framework,這裏主要講解framework部分:

一、驅動部分:

1.    在下列文件中定義

如KEY_SMS

#defineKEY_SMS 252

可能涉及的文件(可能還需要在別的文件):

kernel\include\linux\input.h

bionic\libc\kernel\common\linux\input.h

external\kernel-headers\original\linux\input.h

external\qemu\linux_keycodes.h


2.增加keypad layout文件鍵盤映射,linuxandroidkey映射

如:

key   252   SMS 

注意所用版本和項目使用的KL文件,在adb shell中進入system/usr/keylyout/可以看到所用的KL,可以修改確認使用的KL 

一般定義在kpd.c 的新按鍵會使用***-kpd.kl,也就是註冊input設備爲***-kpd的會使用***-kpd.kl

新增加設備名稱的時候一般會使用generic.kl和qwerty.kl

generic.kl 和qwerty.kl 在alps/frameworks/base/data/keyboards/

***-kpd.kl在config/<projectname>/

其中252 是linux鍵碼,SMS是android識別key值 如果是需要喚醒系統,還需要增加WAKE


二、framework部分

1.修改Java識別keycode

framework/native/include/input/KeyCodelabels.h

KEYCODES數據結構後面增加

{"SMS",220}

 

 framework/native/include/android/KeyCodes.h

在按鍵定義項增加AKEYCODE_SMS  = 220;

 

2.修改Java 鍵盤事件

framework/base/core/java/android/view/keyevent.java

/**

*@hide

*/

public static final int KEYCODE_SMS =220;

 

最後的按鍵爲新增的

private static final int LAST_KEYCODE==KEYCODE_SMS;

 

以上/**/註釋的code是android 非開放API或變量定義的時候,需要添加Java Doc的識別,否則要運行make update-api才能build通過


在KEYCODE_SYMBOLIC_NAMES 中增加name.append(KEYCODE_SMS, "KEYCODE_SMS");

 

如果是系統按鍵,修改framework/base/libs/ui/input.cpp

isSystemKey()增加case AKEYCODE_SMS:

 

3.修改XML文件描述符framework/base/core/res/res/values/attr.xml

<enum name="KEYCODE_SMS"value="220" />

 

4.增加測試驗證log在android

framework\base\policy\src\com\android\internal\polidy\impl\phoneWindowManager.java

在interceptKeyBeforeDispatching()增加

if(keycode== KeyEvent.KEYCODE_SMS){

       log.d(TAG, "interceptKeyTi KEYCODE_SMS keyCode="+ keyCode + " down=" + down + "repeatCount=" + repeatCount + “ keyguardOn=” + keyguardOn + “mHomePressed=” + mHomePressed + “ cancled=” + canceled)


p.s.並不是所有的linux keycode framework都會支持處理,如果您需要增加很多按鍵,就可能超出256(如Touch Panel的手勢識別會用到很到鍵)

inputreader.cpp的KeyboardInputMapper這個class的process函數會先判斷是否是isKeyboardOrGamepadKey.
這裏面會對按鍵的大小進行判斷,條件是:
1.小於272
2.大於352
3.大於等於256且小於272
4.大於等於288且小於320
滿足其一即可。
否則會攔截掉,不會往inputDispatcher和phonewindowmanager.java走

按照以上步驟修改代碼,即可在android系統中增加一個新的keycode。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章