android键值传递

本文详细介绍了Android系统中键值的传递过程,从内核到应用程序层的关键代码解析,涉及input.h、board-rk30-sdk.c、rk29-keypad.kl、keycodes.h、KeycodeLabels.h、attrs.xml和KeyEvent.java等文件,讲解了KEY_HOME等键位的定义、映射及系统响应处理。最后提到了更新API的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、kernel/include/linux/input.h

#define KEY_HOME                102


二、kernel/arch/arm/mach-rk30/board-rk30-sdk.c

{

                .desc   = "home",

                .code   = KEY_HOME,

                .adc_value      = 550,

                .gpio = INVALID_GPIO,

                .active_low = PRESS_LEV_LOW,

},

三、device/rockchip/rksdk/rk29-keypad.kl

key 143   NOTIFICATION      WAKE

key 158   BACK

key 186   AVR_POWER


key 212   CAMERA

此处的值与KeycodeLabels.h对应。

四、frameworks/native/include/android/keycodes.h

/*

 * Key codes.

 */

enum {

    AKEYCODE_STB_POWER       = 179,

    AKEYCODE_STB_INPUT       = 180,

    AKEYCODE_AVR_POWER       = 181,

    AKEYCODE_AVR_INPUT       = 182,

五、frameworks/native/include/input/KeycodeLabels.h

    { "TV_INPUT", 178 },

    { "STB_POWER", 179 },

    { "STB_INPUT", 180 },

    { "AVR_POWER", 181 },

    { "AVR_INPUT", 182 },

此处的值与KeyEvent.java对应。

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

        <enum name="KEYCODE_TV_INPUT" value="178" />

        <enum name="KEYCODE_STB_POWER" value="179" />

        <enum name="KEYCODE_STB_INPUT" value="180" />

        <enum name="KEYCODE_AVR_POWER" value="181" />

        <enum name="KEYCODE_AVR_INPUT" value="182" />

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

     * On TV remotes, switches the input mode on an external Set-top-box. */

    public static final int KEYCODE_STB_INPUT       = 180;

    /** Key code constant: A/V Receiver power key.

     * On TV remotes, toggles the power on an external A/V Receiver. */

    public static final int KEYCODE_AVR_POWER       = 181;

    /** Key code constant: A/V Receiver input key.

     * On TV remotes, switches the input mode on an external A/V Receiver. */

    public static final int KEYCODE_AVR_INPUT       = 182;

   修改 LAST_KEYCODE


八、frameworks/native/libs/input/Input.cpp

bool KeyEvent::isSystemKey(int32_t keyCode) {

    switch (keyCode) {

        case AKEYCODE_MENU:

        case AKEYCODE_SOFT_RIGHT:

        case AKEYCODE_HOME:

        case AKEYCODE_BACK:

        case AKEYCODE_CALL:

        case AKEYCODE_ENDCALL:

        case AKEYCODE_VOLUME_UP:

        case AKEYCODE_VOLUME_DOWN:

        case AKEYCODE_VOLUME_MUTE:


        case AKEYCODE_MUTE:

九、

make update-api

### Android 按键代码表与键值映射 在Android系统中,按键事件从硬件层面到应用程序层的传递涉及多个层次的转换。具体来说: 对于输入设备产生的原始扫描码,在Linux内核驱动程序里会被转化为`input.h`头文件所定义的标准键值[^1]。这些标准键值仅限于操作系统内核内部使用。 为了使上述键值能够在Android框架下正常工作,还需要进一步映射至适用于该平台的具体编码。此过程借助位于特定路径下的`.kl`(keylayout)配置文件实现,它负责建立由Linux识别的键位同Android期望接收之间的一一对应关系。 当涉及到更高级别的应用逻辑处理时,则是在诸如`PhoneWindowManager.java`这样的核心组件之中解析并响应最终确定下来的按键标识符[^2]。 至于具体的按键名称与其数值表示之间的关联,可以参阅如下几个关键位置的信息: - `include/linux/input.h`: 此处列举了基础级别的物理按键代号; - 设备树节点:现代架构倾向于在此指定实际产品上的按钮布局细节; - `KeycodeLabels.h`内的枚举成员:它们给出了面向开发者友好的符号化表达形式以及直观的文字描述[^3]。 下面给出一段Python伪代码来模拟这一系列变换操作的过程: ```python # 假设这是来自底层硬件的一个简单整数型信号量 raw_scan_code = 35 def translate_key(raw): linux_kernel_value_map = { 35: "KEY_PAUSE", # 更多条目... } android_system_value_map = { "KEY_PAUSE": "PAUSE", # 对应更多项... } intermediate_representation = linux_kernel_value_map.get(raw, None) final_representation = android_system_value_map.get(intermediate_representation) return final_representation translated_key_name = translate_key(raw_scan_code) print(f"The translated key name is {translated_key_name}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值