zoukankan      html  css  js  c++  java
  • Android 增加(键盘)按键

     

    以添加 camera按键为例(红色是需要添加的)

    一、kernel键值定义

    1)键扫描码

    ScanCode是由linux的Input驱动框架定义的整数类型,可参考input.h头文件,即getevent得到的键值。

     #define KEY_Q 16

    #define KEY_W 17

    #define KEY_E 18

    #define KEY_R 19

    #define KEY_T 20

          #define KEY_CAMERA  199

    2)键盘布局文件(*.kl)

     将input event报的键值转换成具体键盘对应的按键供android上层使用,时通过键盘布局文件(*.kl)完成转换的。放在/system/usr/keylayout/下面

    而qwert.kl中定义如下:

           ScanCode + 字符串值       

    key 16    Q

    key 17    W

    key 18    E

    key 19    R

    key 20    T

      其中ScanCode 是驱动报的值(即驱动input.h中定义的键值 )

    A:添加kl文件:

    abcxxxx.kl(文件名须与input 的device设备的name一致)

       Key  199   CAMERA

    199为 驱动定义的scanCode ,CAMERA 为Android中 KEYCODES[]定义按键对应的keylabel字符】

    注:

    1kl文件须与键盘输入的input devic 的名称一致,否则EventHub在加载设备时因找不到对应的kl 而加载默认的qwert.kl,导致键值转换错误

    2kl中的scanCode android 中定义的keylabel字符必须对应,否则会转换错误。keyMapper在转换时是根据scanCode,来确定对应的按键字符,再根据此字符在KEYCODES中的位置来确定对应android中的键值。

     

    Bkl文件添加到system

    将kl文件(通常)放在/device/qcom/XXX/(XXX为项目名称)

    1 AndroidBoard.mk 添加:

    include $(CLERA_VARS)

    LOCAL_MODULE                    :=  abcxxxx.kl

    LOCAL_MODULE_TARGS     := optional   eng

    LOCAL_MODULE_CLASS      := ETC

    LOCAL_SRC_FILES                  := $(LOCAL_MODULE)

    LOCAL_MODULE_PATH       := $(TARGET_OUT_KEYLAYOUT)

    include $(BUILD_PREBUILT)

    (2)/device/qcom/common/base.mk添加

    KEYPAD  +=  abcxxxx.kl

    注:不加会导致kl文件不被打包进/system/usr/keylayout/

       

    二、Android 中添加按键

    1)定义按键对应的key label

       在KEYCODES[]数组的最后添加按键的key label,

    即:

    static const KeycodeLabel KEYCODES[] = {

        …

    DEFINE_KEYCODE(HELP)

    DEFINE_KEYCODE(CAMERA )

    };

     

    注:

    位置

    Android 4.4 以前版本  frameworks/base/include/ui/KeycodeLabels.h

    Android 4.4 在framework/native/include/input/KeyCodelabels.h

    Android5.0 以后在framework/native/include/input/InputEventLabels.h

     

    (2)定义keyCode

    A: native 定义(keycodes.h

    enum {

    ………

        AKEYCODE_HELP          = 259,

        AKEYCODE_CAMERA = 260

    };

    注:

    1)位置:frameworks/base/include/android/keycodes.h

    2)此处keycode的定义的值即是 上面key label定义在KEYCODES数组中的位置(index),否则会映射错误

     

    BJAVA 定义(KeyEvent.java定义键值

     public static final int KEYCODE_HELP               = 259;

     public static final int KEYCODE_CAMERA     = 260;

     

    修改LAST_KEYCODE

    private static final int LAST_KEYCODE           = KEYCODE_CAMERA;

     

    注:

    1)位置:frameworks/base/core/java/android/view/KeyEvent.java

    2)此处的key code必须与native定义的一致

     

    C:资源文件(attrs.xml)添加keycode

    注:

    1)位置:frameworksasecore es esvaluesattrs.xml

     

    影响到API则需要调用   make update-api   然后就可以使用了。

     

    三、问题debug

    按键映射出错或 unknown,排查步骤如下:

    •   用 getevent 确认驱动是否报按键值,是否正确
    •   看kl文件名是否正确?【参见1.2.A】
    •   看kl文件是否正确加载,dumpsys  input 查看KeyLayoutFile是否正确
    •   看native定义的key code是否与key label 在KEYCODES[]数组的位置对应
    •   看java层key code定义是否与native定义一致

     

    dumpsys  input KeyLayoutFile如下:

             2:abcxxxx

          Classes: 0x00000001

          Path: /dev/input/event7

          Descriptor: 0ea3e722ddb6fa78cd53a54fc262828fb3df6ca7

          Location: ALSA

          ControllerNumber: 0

          UniqueId:

          Identifier: bus=0x0000, vendor=0x0000, product=0x0000, version=0x0000

          KeyLayoutFile: /system/usr/keylayout/abcxxxx.kl

          KeyCharacterMapFile: /system/usr/keychars/Generic.kcm

          ConfigurationFile:

          HaveKeyboardLayoutOverlay: false

     

         

  • 相关阅读:
    python读取csv文件、excel文件并封装成dict类型的list,直接看代码
    利用Python获取cookie的方法,相比java代码简便不少
    关于appium操作真机打开app之后无法定位页面元素的问题的解决办法
    关于做移动端ui自动化测试使用PC代理网络会出现的问题
    接口测试面试问题总结-转载
    接口测试3-参数关联接口(从上一个接口中获取数据,访问幼儿园服务器接口无session)
    接口测试2-接口测试 get post请求
    HTTP协议
    接口测试1-概论
    python视频学习笔记8(函数返回值和参数进阶)
  • 原文地址:https://www.cnblogs.com/dyufei/p/6612790.html
Copyright © 2011-2022 走看看