zoukankan      html  css  js  c++  java
  • 【转贴】android 添加新的键值,自定义按键

    转自:http://hi.baidu.com/excalibur/item/ce90e99f3ad18acbb6253136

      在android中,上层可使用的键值默认情况下是92个,从0-91;一般情况下,这些键值是够用的,但是如果想扩充的话,还是需要添加新的键值的,那么如何将一个新的键值从驱动的设置映射到上层,使应用可以对我们自定义的键值进行相应的处理呢?
    对keypad来说,涉及到的文件有以下几个:
      1,/vendor/qcom/7k_ffa_keypad.kl
    首先在此文件中,添加新的键值信息:Example: key 123 WLS flag
    注意:新加的键值不要与已有的重复。
      2. kernel/arch/arm/mach-msm/keypad_surf_ffa.c
    在keypad对应的键位添加自定义的键码 如 :123
      3. frameworks/base/include/ui/keycodeLabels.h
    在数组keycodes 中添加 新定义的信息
    { "MUTE", 91 }, { "WLS" , 92 }
    枚举类型 KeyCode 中添加
    kKeyCodeMute = 91
    kKeyCodeWLS = 92
      4. frameworks/base/core/res/res/values/attrs.xml
    <enum name="KEYCODE_MUTE" value="91"/>
    <enum name="KEYCODE_WLS" value="92" />
      5. frameworks/base/core/java/android/view/KeyEvent.java
    public static final int KEYCODE_MUTE = 91;
    public static final int KEYCODE_WLS = 92;
    注意: private static final int LAST_KEYCODE = KEYCODE_MUTE;
    应改为: private static final int LAST_KEYCODE = KEYCODE_WLS;

    在函数 public final boolean isSystem() 中,同样需要添加:
    case KEYCODE_SEARCH:
    case KEYCODE_WLS:
    //注意:现在(Android 2.3)这个函数调用的是frameworks\base\libs\ui\Input.cpp中的bool KeyEvent::isSystemKey(int32_t keyCode)
    //这里使用的按键定义在./development/ndk/platforms/android-9/include/android/keycodes.h
    通过以上的更改,新的键值就添加上去了,由于更改了 KeyEvent,影响到了API,
    所以需要make update-api

    如果对新键值进行处理,可以通过获取相应的keycode,对它进行处理;
    对于按键事件的处理一般如下文件中
      6. frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java

    综上可知,我们可以根据需求定义自己的键值,并对键值所对应的事件信息进行合理化处理。

      注:7k_ffa_keypad.kl是专门给7k_ffa_keypad输入设备使用的keylayout文件,所以修改7k_ffa_keypad.kl 文件只是给键盘输入增加键值。如果是其他设备的输入,如x_input,而且当没有x_iput.kl存在的时候,那么默认的kl文件就是 qwerty.kl(android-root/development/emulator/keymaps/qwerty.kl)
    这个很重要。也就是说需要实现明白添加的键值是否是7k_ffa_keypad的input event

      我的理解:看了一下key character map的处理,是通过读取kcm文件然后使用驱动程序提供的ioctl函数去修改来自输入设备的扫描码和系统预定义的keycode的映射关系。 kl文件应该也可以这么理解。这样的话,对于硬件扫描码,只需要修改这个kl文件。上层得到的都是系统预定义的keycode。
    重要补充:
      映射关系:ir硬件扫描码在驱动里面被 映射为 kernel/include/linux/input.h里面定义的某个键值。但是这个键值只在linux系统中使用。
      Android通过源码目录下的device/xxx/xxx.kl( keylayout )文件完成linux键值到Android系统要使用的键值的映射

  • 相关阅读:
    CSS3盒模型display初探(display:box/display:flex)
    css伪元素研究(::before/::after)
    css后代选择器(div.class中间不带空格)
    css选择器(选择<div>内所有<p>元素)
    text-indent无效解决方案
    控制div位于最上层
    gulp用途
    Webpack打包工具实时更新操作(启用观察者模式)
    CLR/.NET/C#/Visual Studio/ASP.NET各版本之间的关系(转)
    前端打包/自动化构建工具:fis3
  • 原文地址:https://www.cnblogs.com/jevan/p/2771782.html
Copyright © 2011-2022 走看看