• 在Android4.4上新增加keycode


    keycode是android定义好的,但是有时候无法满足需要,进行定制化难免会涉及到新增加keycode。分成两部分,驱动和framework,这里主要讲解framework部分:

    一、驱动部分:

    1.    在下列文件中定义

    如KEY_SMS

    #defineKEY_SMS 252

    可能涉及的文件(可能还需要在别的文件):

     

    kernelincludelinuxinput.h

    bioniclibckernelcommonlinuxinput.h

    externalkernel-headersoriginallinuxinput.h

    externalqemulinux_keycodes.h

     

    2.增加keypad layout文件键盘映射,linux和androidkey映射

     

    如:

    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

    frameworkasepolicysrccomandroidinternalpolidyimplphoneWindowManager.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。

  • 相关阅读:
    003 Rabbitmq的简单队列
    002 Rabbitmq的安装
    001 消息中间件--Rabbitmq
    013 mybatis整合
    013 Durid监控
    012 druid数据源
    011 嵌入式容器
    集成支付宝IOS
    2015起航,
    python 创建用户
  • 原文地址:https://www.cnblogs.com/bluestorm/p/4886667.html
Copyright © 2020-2023  润新知