日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

android4.0 添加一個(gè)新的android 鍵值

 昵稱2009261 2014-04-25

 這里添加新的鍵值,不是毫無(wú)憑據(jù)憑空創(chuàng)造的一個(gè)鍵值,而是根據(jù)kernel中檢測(cè)到的按鍵值,然后轉(zhuǎn)化為android所需要的數(shù)值:

以添加一個(gè)linux鍵值為217,把它映射為android的鍵值Browser(這個(gè)鍵值之前不存在)為例介紹一下:

1、android之前沒(méi)有這個(gè)鍵值,需要定義

/frameworks/base/core/java/android/view/KeyEvent.java

//定義這個(gè)新的鍵值

public static final int KEYCODE_BROWSER      = 210;

然后我們會(huì)看到有如下注釋:

// 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

//  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.

上面的注釋已經(jīng)為我們指明了添加鍵值所需要的步驟:

2、/frameworks/base/core/java/android/view/KeyEvent.java

    public final boolean isSystem() {

        return native_isSystemKey(mKeyCode);

    }

/frameworks/base/jni/android_view_KeyEvent.java

static jboolean native_isSystemKey(JNIEnv* env, jobject clazz, jint keyCode) {

    return KeyEvent::isSystemKey(keyCode);

}

/frameworks/base/libs/ui/Input.cpp

bool KeyEvent::isSystemKey(int32_t keyCode) {

switch (keyCode) {

……

         case AKEYCODE_BROWSER:

             return true;

}

}

3native/include/android/keycodes.h

/*

 * Key codes.

 */

enum {

……

AKEYCODE_CALCULATOR      = 210,

AKEYCODE_BROWSER        = 211,

}

4、frameworks/base/include/ui/KeycodeLabels.h

  這里定義的實(shí)際上是我們?cè)?span style="font-family:Courier New">kl文件,也就是linux keyandroid key的一個(gè)映射表中的linux鍵值和android鍵值的名稱;

比如atc260x-irkeypad.kl

……

key  217  BROWSER //這里的BROWSER就是我們定義的android鍵值的字符形式,217則是linux鍵值

      

那么,BROWSER不能無(wú)緣無(wú)故就使用,必然有定義位置,這個(gè)位置就是KeycodeLabels.h

static const KeycodeLabel KEYCODES[] = {

……

{ "CALCULATOR", 210 },

{"BROWSER",     211}, //這里的BROWSER就是我們上面使用的東西,而211android鍵值

{ NULL,           0}

}

EventHub.cpp中加載并解析這個(gè)mapatc260x-irkeypad.kl,那么得到的是linux鍵值217keystring,這個(gè)string就是BROWSER,有了上面這個(gè)KEYCODES數(shù)組,就可以獲得它對(duì)應(yīng)的android鍵值了。

5、external/webkit/WebKit/android/plugins/ANPKeyCodes.h

enum ANPKeyCodes {

……

kAppSwitch_ANPKeyCode = 186,

kBrowser_ANPKEYCODE    = 211,

};

6、frameworks/base/core/res/res/values/attrs.xml

<attr name="keycode">

   <enum name="KEYCODE_CALCULATOR" value="210" />

   <enum name="KEYCODE_BROWSER" value="211" />

</attr>

7/frameworks/base/core/java/android/view/KeyEvent.java

LAST_KEYCODE也就是最后一個(gè)keycode,因?yàn)樘砑恿诵碌?,所以需要更改這個(gè)的數(shù)值

LAST_KEYCODE = KEYCODE_BROWSER

 private static final 

SparseArray<String> KEYCODE_SYMBOLIC_NAMES = new SparseArray<String>();

private static void populateKeycodeSymbolicNames() {

……

names.append(KEYCODE_MUSIC, "KEYCODE_MUSIC");

         names.append(KEYCODE_CALCULATOR, "KEYCODE_CALCULATOR");

names.append(KEYCODE_BROWSER, "KEYCODE_BROWSER");

}

這些操作完成了之后,就完成了linux鍵到android的鍵值映射。也就是android中多了一個(gè)KEYCODE_BROWSER它的值是211.


后面我們會(huì)分析為什么這樣添加。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多