• Android4.0 添加一个新的Android 键值


     

     这里添加新的键值,不是毫无凭据凭空创造的一个键值,而是根据kernel中检测到的按键值,然后转化为Android所需要的数值:

    以添加一个Linux键值为217,把它映射为android的键值Browser(这个键值之前不存在)为例介绍一下:

    1、android之前没有这个键值,需要定义

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

    //定义这个新的键值

    public static final int KEYCODE_BROWSER      = 210;

    然后我们会看到有如下注释:

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

    上面的注释已经为我们指明了添加键值所需要的步骤:

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

      这里定义的实际上是我们在kl文件,也就是linux keyandroid key的一个映射表中的linux键值和android键值的名称;

    比如atc260x-irkeypad.kl

    ……

    key  217  BROWSER //这里的BROWSER就是我们定义的android键值的字符形式,217则是linux键值

          

    那么,BROWSER不能无缘无故就使用,必然有定义位置,这个位置就是KeycodeLabels.h

    static const KeycodeLabel KEYCODES[] = {

    ……

    { "CALCULATOR", 210 },

    {"BROWSER",     211}, //这里的BROWSER就是我们上面使用的东西,而211android键值

    { NULL,           0}

    }

    EventHub.cpp中加载并解析这个mapatc260x-irkeypad.kl,那么得到的是linux键值217keystring,这个string就是BROWSER,有了上面这个KEYCODES数组,就可以获得它对应的android键值了。

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

    enum ANPKeyCodes {

    ……

    kAppSwitch_ANPKeyCode = 186,

    kBrowser_ANPKEYCODE    = 211,

    };

    6frameworks/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也就是最后一个keycode,因为添加了新的,所以需要更改这个的数值

    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中多了一个KEYCODE_BROWSER它的值是211.


    //////////////////////////////android 4.3 添加新键值//////////////////////////////

    root@ubuntu:/data/work/rD016_Softwarelower/frameworks# ack-grep KEYCODE_RESET_WIFI
    base/libs/androidfw/Input.cpp
    116:        case AKEYCODE_RESET_WIFI:
    base/core/res/res/values/attrs.xml
    1554:        <enum name="KEYCODE_RESET_WIFI" value="223" />
    base/core/java/android/view/KeyEvent.java
    635:    public static final int KEYCODE_RESET_WIFI      = 223;
    637:    private static final int LAST_KEYCODE           = KEYCODE_RESET_WIFI;
    882:        names.append(KEYCODE_RESET_WIFI, "KEYCODE_RESET_WIFI");
    native/include/android/keycodes.h
    269:    AKEYCODE_RESET_WIFI      = 223,

    /////////////////////////////////////////////////////////////////////////////// 

  • 相关阅读:
    C# 反射 通过类名创建类实例
    c#委托把方法当成参数
    PPT美化大师
    以Outlook样式分组和排列数据项
    使用windows服务和MSMQ和进行日志管理(解决高并发问题)
    springboot配置filter
    filter 中用spring StopWatch 监控请求执行时间
    spring计时工具类stopwatch用法
    Spring异步任务处理,@Async的配置和使用
    注解用法详解——@SuppressWarnings
  • 原文地址:https://www.cnblogs.com/muhuacat/p/6085996.html
Copyright © 2020-2023  润新知