Android4.2.2自增物理按鍵(frameworks)

來源:互聯網
上載者:User

標籤:android   keycode   

當我們修改了frameworks後可能出現:
make: *** [out/target/common/obj/PACKAGING/checkapi-current-timestamp] 錯誤 38
解決辦法:make update-api


在Android中添加物理按鍵:KEYCODE_HELP
1、Android 增加按鍵:
ScanCode -> KeyCodeLabel -> KeyCode -> Keyevent
-----
1) 鍵掃描碼ScanCode是由linux的Input驅動架構定義的整數類型,可參考input.h標頭檔(./external/kernel-headers/original/linux/input.h)。
2) 按鍵碼(KeyCode),這個按鍵碼是一個整數,在上層的JAVA程式中主要通過這個值來判斷系統的實現。
----
實現過程:
1, ScanCode -> KeyCodeLabel。
鍵盤配置檔案(*.kl) 把ScanCode轉換為KeyCodeLabel。 *.kl檔案在源碼的devices檔案夾中如(/device/rockchip/rk30sdk_bnd/rk29-keypad.kl)或裝置中的/system/usr/keylayout/*.kl。
key 138   HELP      //這裡的HELP就是我們定義的android鍵值的字元形式,138則是linux鍵值, HELP 不能無緣無故就使用,必然有定義位置,這個位置就是KeycodeLabels.h
2,KeyCodeLabel -> KeyCode。
通過尋找KEYCODES[]數組,得到KeyCodeLabel字串對應的KeyCode值。KEYCODES[]在檔案/frameworks/base/include/androidfw/KeycodeLabels.h 中。
這裡定義的實際上是我們在kl檔案,也就是linux key到android key的一個映射表中的linux鍵值和android鍵值的名稱;比如rk29-keypad.kl:
static const KeycodeLabel KEYCODES[] = {
...
    { "ASSIST", 219 },
     //add by hcm
    { "HELP", 220 },
在/frameworks/native/include/android/keycodes.h中定義KeyCode的枚舉值。
enum {
....
    AKEYCODE_ASSIST          = 219,
    //add by hcm
    AKEYCODE_HELP          = 220,
......}
在EventHub.cpp中載入並解析這個map:rk29-keypad.kl,那麼得到的是linux鍵值138為key的string,這個string就是HELP,有了上面這個KEYCODES數組,就可以獲得它對應的android鍵值了。




3,KeyCode -> Keyevent。
KeyEvent.java中的對應KeyCode:(檔案路徑:/frameworks/base/core/java/android/view/KeyEvent.java)。
KeyEvent.java中有一個非常重要的提示,那就是我們自己填特殊按鍵的流程,但是我這是瑞芯微3168,Android4.2.2的原始碼,源碼中的注釋路徑是有誤的!:
// NOTE: If you add a new keycode here you must also add it to:
    //  isSystem()
    //  native/include/android/keycodes.h
    //  frameworks/base/include/ui/KeycodeLabels.h 應該為:/frameworks/base/include/androidfw/KeycodeLabels.h
    //  external/webkit/WebKit/android/plugins/ANPKeyCodes.h
    //  frameworks/base/core/res/res/values/attrs.xml
    //  emulator?
    //  LAST_KEYCODE
    //  KEYCODE_SYMBOLIC_NAMES
    //
    //  Also Android currently does not reserve code ranges for vendor-
    //  specific key codes.  If you have new key codes to have, you
    //  MUST contribute a patch to the open source project to define
    //  those new codes.  This is intended to maintain a consistent
    //  set of key code definitions across all Android devices.
如果改動了KeyEvent,影響到API則需要調用make update-api。
LAST_KEYCODE修改:
    /** Key code constant: add by hcm, help key. */
    public static final int KEYCODE_HELP          = 220;
    private static final int LAST_KEYCODE           = KEYCODE_HELP;
....
(KEYCODE_SYMBOLIC_NAMES修改)
        names.append(KEYCODE_ASSIST, "KEYCODE_ASSIST");
        names.append(KEYCODE_HELP, "KEYCODE_HELP");
....
4、根據上面提示修改isSystem(),代碼跟蹤:
isSystem() 在/frameworks/base/core/java/android/view/KeyEvent.java
public final boolean isSystem() {
return native_isSystemKey(mKeyCode);
}
 
/frameworks/base/core/jni/android_view_KeyEvent.cpp
static jboolean native_isSystemKey(JNIEnv* env, jobject clazz, jint keyCode) {
return KeyEvent::isSystemKey(keyCode);
}
 
/frameworks/base/libs/androidfw/Input.cpp
bool KeyEvent::isSystemKey(int32_t keyCode) {
switch (keyCode) {
……
        case AKEYCODE_SEARCH:
//add by hcm
        case AKEYCODE_HELP:
}
}
5、/external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.h
enum ANPKeyCodes {
……
 
    kAppSwitch_ANPKeyCode = 187,
//add by hcm
    kHelp_ANPKeyCode = 220,
};
6、frameworks/base/core/res/res/values/attrs.xml
<attr name="keycode">
 .....................
     <enum name="KEYCODE_RO" value="217" />
        <enum name="KEYCODE_KANA" value="218" />
        <enum name="KEYCODE_HELP" value="220" />
    </attr>
</attr>


這些操作完成了之後,就完成了linux鍵到android的鍵值映射。也就是android中多了一個KEYCODE_HELP它的值是220.
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.