android键盘输出增加按键码

Android 自定义按键添加流程 和你一起终身学习,这里是程序员Android经典好文推荐,通过阅读本文,您将收获以下知识点:一、驱动通过GPIO连接的按键二、Framework 层添加按键响应方法三、参考文献一、驱动通过GPIO连接的按键此类按键采用GPIO来连接,通过监测其中断来判断按键的动作,需要根据具体硬件设计在项目对应的dts文件配置gpio_keys节点。底层驱动主要修改以下两个文件上报键值。1.修改 sp9863a-... 阅读详情

开发过程中免不得需要增加或减少按键码值,在android2.3系统事件处理部分,主要向上层提供统一的按键码(KeyCode),这个按键码是一个整数,在上层的JAVA程序中主要通过这个值来判断系统的实现。

关于输入事件的处理前面已经讲过,请参考:http://blog.youkuaiyun.com/andyhuabing/article/details/7006688

       这里主要讲android事件的处理过程,需要经过两个转换步骤: 

  1、键扫描码ScanCode是由linux的Input驱动框架定义的整数类型,可参考input.h头文件 

         在步骤一中将其值转换成表示按键的字符串

        键盘布局文件(*.kl)将完成第一步的转换,放在/system/usr/keylayout/下面

        举例如下:

        input.h 中字母键定义:

        #define KEY_Q 16
#define KEY_W 17
#define KEY_E 18
#define KEY_R 19
#define KEY_T 20
#define KEY_Y 21
#define KEY_U 22
#define KEY_I 23
#define KEY_O 24
#define KEY_P 25        

       而qwert.kl中定义如下:

       ScanCode + 字符串值       

      key 16    Q
key 17    W
key 18    E
key 19    R
key 20    T
key 21    Y
key 22    U
key 23    I
key 24    O
key 25    P     

   2、通过查找KEYCODES数组,将literal字符串转换成value的整型值,即转换到KeyCode值了

       片段如下,右边的值是android系统中使用的KeyCode值:(文件路径:frameworks/base/include/ui/KeycodeLabels.h)

static const KeycodeLabel KEYCODES[] = {

    ...

    { "A", 29 },
    { "B", 30 },
    { "C", 31 },
    { "D", 32 },
    { "E", 33 },
    { "F", 34 },
    { "G", 35 },
    { "H", 36 },
    { "I", 37 },
    { "J", 38 },
    { "K", 39 },
    { "L", 40 },
    { "M", 41 },
    { "N", 42 },
    { "O", 43 },
    { "P", 44 },
    { "Q", 45 },
    { "R", 46 },
    { "S", 47 },
    { "T", 48 },
    { "U", 49 },
    { "V", 50 },
    { "W", 51 },
    { "X", 52 },
    { "Y", 53 },
    { "Z", 54 },

    ...

};

   右边的值在android中定义如下:(文件路径:frameworks/base/include/android/keycodes.h)

  /*
 * Key codes.
 */
enum {

     AKEYCODE_A               = 29,
    AKEYCODE_B               = 30,
    AKEYCODE_C               = 31,
    AKEYCODE_D               = 32,
    AKEYCODE_E               = 33,
    AKEYCODE_F               = 34,
    AKEYCODE_G               = 35,
    AKEYCODE_H               = 36,
    AKEYCODE_I               = 37,
    AKEYCODE_J               = 38,
    AKEYCODE_K               = 39,
    AKEYCODE_L               = 40,
    AKEYCODE_M               = 41,
    AKEYCODE_N               = 42,
    AKEYCODE_O               = 43,
    AKEYCODE_P               = 44,
    AKEYCODE_Q               = 45,
    AKEYCODE_R               = 46,
    AKEYCODE_S               = 47,
    AKEYCODE_T               = 48,
    AKEYCODE_U               = 49,
    AKEYCODE_V               = 50,
    AKEYCODE_W               = 51,
    AKEYCODE_X               = 52,
    AKEYCODE_Y               = 53,
    AKEYCODE_Z               = 54,

   ..

};

   这里的键值与KeyEvent.java中的值是对应的:(文件路径:frameworks/base/core/java/android/view/KeyEvent.java)

      /** Key code constant: 'A' key. */
    public static final int KEYCODE_A               = 29;
    /** Key code constant: 'B' key. */
    public static final int KEYCODE_B               = 30;
    /** Key code constant: 'C' key. */
    public static final int KEYCODE_C               = 31;
    /** Key code constant: 'D' key. */
    public static final int KEYCODE_D               = 32;
    /** Key code constant: 'E' key. */
    public static final int KEYCODE_E               = 33;
    /** Key code constant: 'F' key. */
    public static final int KEYCODE_F               = 34;
    /** Key code constant: 'G' key. */
    public static final int KEYCODE_G               = 35;
    /** Key code constant: 'H' key. */
    public static final int KEYCODE_H               = 36;
    /** Key code constant: 'I' key. */
    public static final int KEYCODE_I               = 37;
    /** Key code constant: 'J' key. */
    public static final int KEYCODE_J               = 38;
    /** Key code constant: 'K' key. */
    public static final int KEYCODE_K               = 39;
    /** Key code constant: 'L' key. */
    public static final int KEYCODE_L               = 40;
    /** Key code constant: 'M' key. */
    public static final int KEYCODE_M               = 41;
    /** Key code constant: 'N' key. */
    public static final int KEYCODE_N               = 42;
    /** Key code constant: 'O' key. */
    public static final int KEYCODE_O               = 43;
    /** Key code constant: 'P' key. */
    public static final int KEYCODE_P               = 44;
    /** Key code constant: 'Q' key. */
    public static final int KEYCODE_Q               = 45;
    /** Key code constant: 'R' key. */
    public static final int KEYCODE_R               = 46;
    /** Key code constant: 'S' key. */
    public static final int KEYCODE_S               = 47;
    /** Key code constant: 'T' key. */
    public static final int KEYCODE_T               = 48;
    /** Key code constant: 'U' key. */
    public static final int KEYCODE_U               = 49;
    /** Key code constant: 'V' key. */
    public static final int KEYCODE_V               = 50;
    /** Key code constant: 'W' key. */
    public static final int KEYCODE_W               = 51;
    /** Key code constant: 'X' key. */
    public static final int KEYCODE_X               = 52;
    /** Key code constant: 'Y' key. */
    public static final int KEYCODE_Y               = 53;
    /** Key code constant: 'Z' key. */
    public static final int KEYCODE_Z               = 54;

    ...

      如果改动了这里,影响到API则需要调用make update-api

ok,理清楚了以上的转换关系,下面就说一下如何增加按键,以增加gamekey为例:

1 、键盘布局文件中增加键,一般是qwery.kl (一定是以*.kl结尾的文件):

  key 304 BUTTON_A 

  key 305 BUTTON_B

  key 306 BUTTON_C

  key 307 BUTTON_X

  key 308 BUTTON_Y

  key 309 BUTTON_Z

  key 315 BUTTON_START

  key 316 BUTTON_MODE


2、在frameworks/base/include/ui/KeycodeLabels.h中增加KeycodeLabel类型的Code数组

    { "BUTTON_A", 96 },
    { "BUTTON_B", 97 },
    { "BUTTON_C", 98 },
    { "BUTTON_X", 99 },
    { "BUTTON_Y", 100 },
    { "BUTTON_Z", 101 },

    { "BUTTON_START", 108 },

    { "BUTTON_MODE", 110 },      

    目前的2.3系统已经添加


  3、在frameworks/base/include/android/keycodes.h中增加KeyCode的枚举值

    AKEYCODE_BUTTON_A        = 96,
    AKEYCODE_BUTTON_B        = 97,
    AKEYCODE_BUTTON_C        = 98,
    AKEYCODE_BUTTON_X        = 99,
    AKEYCODE_BUTTON_Y        = 100,
    AKEYCODE_BUTTON_Z        = 101,

    AKEYCODE_BUTTON_START    = 108,
    AKEYCODE_BUTTON_MODE     = 110,   

     目前的2.3系统已经添加


4、JAVA层的keyEvent.java中增加用于java应用程序使用

     略,目前的2.3系统已经添加


5、在frameworks\base\core\res\res\values\attrs.xml中增加表示属性的资源文件,添加相应用name="keycode"的attr

        <enum name="KEYCODE_BUTTON_A" value="96" />

        <enum name="KEYCODE_BUTTON_B" value="97" />

        <enum name="KEYCODE_BUTTON_C" value="98" />

        <enum name="KEYCODE_BUTTON_X" value="99" />

        <enum name="KEYCODE_BUTTON_Y" value="100" />

        <enum name="KEYCODE_BUTTON_Z" value="101" />

        <enum name="KEYCODE_BUTTON_START" value="108" />

        <enum name="KEYCODE_BUTTON_MODE" value="110" />


ok,完成以上步骤应该就可以使用了。


查找key是否有没有被过滤掉重点确认的地方:

1、EventHub.cpp 文件中的getEvent函数

    if (iev.type == EV_KEY) {
               status_t err = device->layoutMap->map(iev.code,
                         & outEvent->keyCode, & outEvent->flags);
               LOGV("iev.code=%d keyCode=%d flags=0x%08x err=%d\n",
                          iev.code, outEvent->keyCode, outEvent->flags, err);
               if (err != 0) {
                      outEvent->keyCode = AKEYCODE_UNKNOWN;
                       outEvent->flags = 0;
               }

       }

    确认这里转换是否ok了,如果没有则可能*.kl文件中没有添加进去这个键值 


2、InputReader.cpp文件中的KeyboardInputMapper处理函数process

    void KeyboardInputMapper::process(const RawEvent* rawEvent) {
    switch (rawEvent->type) {
    case EV_KEY: {
        int32_t scanCode = rawEvent->scanCode;
        if (isKeyboardOrGamepadKey(scanCode)) {
            processKey(rawEvent->when, rawEvent->value != 0, rawEvent->keyCode, scanCode,
                    rawEvent->flags);
        }
        break;
    }
    }
}

bool KeyboardInputMapper::isKeyboardOrGamepadKey(int32_t scanCode) {
    return scanCode < BTN_MOUSE
        || scanCode >= KEY_OK
        || (scanCode >= BTN_GAMEPAD && scanCode < BTN_DIGI);
}


可以在processKey中加打印,确认已通过notifyKey上报键值给android系统了。

 

附加,如何编译生成qwerty.kcm.bin 文件:

android为了减少载入时间,并没有使用原始按键表文件,而是将其转换成二进制文件
转换的工具源代码在android源代码build/tools/kcm目录下,android在编译过程中会
首先编译转换工具,然后利用转换工具将qwerty.kcm文件转换成qwerty.kcm.bin

转换后的二进制文件复制到out/target/product/<board_name>/system/usr/keychars
目录下,也就是目标平台的/system/usr/keychars目录中。

用法:

static int usage()
{
    fprintf(stderr,
            "usage: kcm INPUT OUTPUT\n"
            "\n"
            "INPUT   keycharmap file\n"
            "OUTPUT  compiled keycharmap file\n"
        );
    return 1;
}

 

Android9.0 Framework层添加key事件 近日,开发新需求,内核层需要上报定制事件,简单来看就是使用系统现成儿定义好的,却没有使用的,结果这样操作后,发现上层UI会不自主的响应,返回或者上下左右控件切换等 最终决定,在之前的键值范围新定义事件,就需要Framework层进行同步新增定制 需求说完,直接上代码: diff --git a/api/current.txt b/api/current.txt index 0e35fd6f86e..48e642d6d01 100644 --- a/api/current.txt +++ ... 阅读详情

相关推荐

Adafruit蓝牙HID键盘控制器:从协议原理到实战复现全解析

HID(人机交互设备)协议是鼠标、键盘等设备与操作系统通信的通用语言,基于BLE(低功耗蓝牙)的HID Over GATT规范则让无线输入设备无需驱动即可跨平台即连即用。理解HID报告描述符与按键报文格式,是开发自定义蓝牙键盘、宏控制器或媒体遥控器的核心基础。Adafruit Learning System提供的蓝牙HID键盘控制器方案,以nRF52840等开发板为载体,封装了复杂的蓝牙协议栈与HID服务,使开发者能快速将物理按键变为标准蓝牙键盘。该方案覆盖从矩阵扫描、固件烧录到低功耗优化、重连调试的完整链

weixin_30786657的博客 424

android系统添加KeyEvent

添加Android 自定义按键的keyevent

weixin_43770182的博客 592

告别城市峡谷定位漂移:手把手教你用PSINS仿真INS/NHC/ODO组合导航(附代码获取)

本文详细解析了INS/NHC/ODO组合导航系统在城市峡谷环境中的应用,通过PSINS平台实现精准定位。文章涵盖核心原理、环境搭建、算法实现及性能优化,帮助开发者解决GNSS信号中断时的定位漂移问题,提升自动驾驶系统在复杂环境中的可靠性。

weixin_30329623的博客 429

android中按键的扫描码和键值

kernel中的按键驱动通过input子系统上报的键值叫做扫描码(ScanCode),对应头文件在 kernel/include/uapi/linux/input.h andorid中的用到的按键才叫键值(KeyCode),  其定义可参考 frameworks/base/core/java/android/view/KeyEvent.java  /development/ndk/pl

Yasin Lee 9214

硬件基础(4):(6)高精度ADC设计中模拟地与数字地的划分与连接

在实际 PCB 设计中,**接地与布线**对于获得干净的参考电压和高精度 ADC 测量至关重要。下面详细阐述**如何在硬件层面减少数字噪声耦合到模拟电路、保障参考电压的稳定性**。

FCZlll的博客 2645

用PLECS搞定三相逆变器电流环:从传递函数推导到PI参数整定的保姆级教程

本文提供了一份详细的PLECS教程,指导如何从传递函数推导到PI参数整定,实现三相逆变器电流环的闭环控制。通过坐标变换、控制器设计和仿真验证等步骤,帮助工程师快速掌握电流环控制技术,提升电力电子系统的稳定性和可靠性。

weixin_27102543的博客 399

Android应用程序中模拟发送键盘触摸消息

在Android应用程序中,可以通过代码来发送键盘按键、触摸屏操作等input消息。 具体可参考Instrumentation.java中的public void sendKeySync(KeyEvent event)方法。

michaelpp的专栏 1369

2021年软件测试面试题大全

简述测试流程: 1、阅读相关技术文档(如产品PRD、UI设计、产品流程图等)。 2、参加需求评审会议。 3、根据最终确定的需求文档编写测试计划。 4、编写测试用例(等价类划分法、边界值分析法等)。 5、用例评审(主要参与人员:开发、测试、产品、测试leader)。 6、开发提交代码至SVN或者GIT ,配管搭建测试环境。 7、执行测试用例,记录发现的问题。 8、验证bug与回归测试。 9、编写测试报告。 10、产品上线。 补充测试用例设计过程: 根据需求得出测试需求 设计测试方

hard_days的博客 20万+

android 键盘 码,Android键盘输出增加按键码

开发过程中免不得需要增加或减少按键码值,在Android2.3系统事件处理部分,主要向上层提供统一的按键码(KeyCode),这个按键码是一个整数,在上层的JAVA程序中主要通过这个值来判断系统的实现。关于输入事件的处理前面已经讲过,请参考:http://www.linuxidc.com/Linux/2012-01/50691.htm这里主要讲android事件的处理过程,需要经过两个转换步骤: ...

weixin_30974667的博客 407

电机控制个人学习路线及专业书籍资源分享

个人学习电机控制的学习路线,和相关专业书的电子文档分享

weixin_45182459的博客 9913

Qt自带绘图与GDI+绘图方式比较_gdi+实时绘制qt(2)

2、GDI+是Windows操作系统中的图形设备接口,它提供了一套用于绘制图形的API,包括了图形渲染、图形变换、图形剪切、图形填充等功能,使开发者可以快速地开发出各种类型的图形应用程序。1、Qt是一个跨平台的C++应用程序框架,它提供了一套用于GUI编程的类库,包括了绘图、网络、XML、数据库、多线程等模块,使开发者可以快速地开发出高质量的跨平台应用程序。Qt提供了一套用于绘图的类库,包括了QPainter、QPen、QBrush等类,使开发者可以快速地进行图形绘制。

qq_17136213的博客 917

Android键盘输出增加按键码

您的评价:        收藏该经验     开发过程中免不得需要增加或减少按键码值,在android2.3系统事件处理部分,主要向上层提供统一的按键码(KeyCode),这个按键码是一个整数,在上层的JAVA程序中主要通过这个值来判断系统的实现。        这里主要讲android事件的处理过程,需要经过两个转换步骤:

kerson的专栏 1627

4、LTE无人机认证:保障通信安全的新方案

本文针对LTE网络中无人机通信存在的安全风险,提出了一种基于可信第三方GCS的新型认证协议。该协议通过非对称加密和哈希函数保护IMSI等敏感信息,防止身份泄露、中间人攻击、拒绝服务攻击和位置追踪等威胁。利用Scyther工具对协议进行形式化分析,验证了其在机密性、一致性和活性等方面的安全属性,证明该方案能有效提升无人机在LTE网络中的通信安全性与隐私保护能力。

pink的博客 60

蓝牙HID键盘控制器实战:基于CircuitPython与nRF52840

HID(Human Interface Device)是计算机识别键盘、鼠标等输入设备的基础协议,蓝牙HID则将其扩展到了无线传输层面,让BLE设备无需驱动即可被主机识别为标准键盘。理解HID描述符与报告格式,是开发自定义输入设备的起点。借助CircuitPython这种高易用性的嵌入式开发框架,配合nRF52840芯片内置的BLE协议栈,开发者只需少量代码就能实现一个开箱即用的蓝牙无线键盘。这类方案在辅助输入、媒体控制、宏键盘等场景中价值明显,也适合快速搭建原型。本文基于Adafruit硬件平台,从协议原

weixin_33851177的博客 571

SIMATIC WINCC V8.0安装教程(Win11系统)

SIMATIC WINCC V8.0安装教程(Win11系统)

Robot_PLC_HMI_Automation 9038

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

基于蓝牙HID协议实现无网络自动化设备控制:ESP32实战指南

蓝牙HID(Human Interface Device)协议是无线键盘、鼠标等外设与主机通信的底层标准,通过定义设备功能描述符和数据报告格式实现设备识别与指令传输。其核心原理在于设备通过模拟标准输入外设的协议栈,向操作系统发送结构化的按键或位移数据包,从而被识别为物理外设。这项技术的工程价值在于其环境无关性和高权限模拟能力,能够绕过传统软件方案对网络环境和特定API的依赖,直接作用于操作系统输入层。在自动化测试、无障碍辅助、远程控制等场景中,基于ESP32等微控制器构建的蓝牙HID控制器,可通过编写脚本发

weixin_34321753的博客 345

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

基于蓝牙HID协议实现自动化投屏控制:ESP32硬件方案详解

蓝牙HID(人机接口设备)协议是蓝牙技术中用于连接键盘、鼠标等输入设备的核心规范,其原理在于通过蓝牙低功耗(BLE)通信,模拟标准USB HID设备与主机进行交互。这项技术的工程价值在于提供了操作系统级别的、跨平台的硬件控制接口,绕开了上层应用软件的限制,从而在自动化控制、无障碍辅助和硬件遥控等领域展现出极高的稳定性和兼容性。在应用场景上,它特别适合需要可靠、低延迟触发系统级快捷键的场合,例如会议室设备管理、多显示器测试自动化等。本文聚焦于利用ESP32微控制器结合蓝牙HID协议,构建一个能够模拟键盘输入、

weixin_33762130的博客 485

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

基于金属接近开关的智能手机支架DIY:模拟电路实现自动亮屏

传感器技术是实现设备智能感知与自动控制的基础,其中接近开关作为一种常见的非接触式检测元件,通过电磁感应原理,能在金属物体靠近时输出开关信号。这种技术因其成本低廉、可靠性高,在工业自动化、安防门禁等领域广泛应用。其核心价值在于将物理世界的状态变化转化为电信号,从而实现自动化控制逻辑。在消费电子和DIY创客领域,巧妙利用接近开关等基础元件,可以低成本地实现便捷的智能交互功能。例如,结合电容充放电的模拟电路设计,无需编程即可将接近开关的触发信号转化为标准的耳机线控按键脉冲,从而控制手机亮屏与息屏。本项目正是基于这

weixin_30383279的博客 443

AI中间层:实时修复UI/UX体验断裂的轻量级方案

UI/UX体验断裂是指用户在真实交互中遭遇的非功能性障碍,如按钮无响应、表单校验失效、跨端兼容异常等,其根源常在于设计预设与真实行为之间的鸿沟。这类问题不属传统Bug范畴,无法靠单元测试覆盖,也难以通过A/B测试或热修复及时响应。AI中间层技术通过在请求链路中部署独立、低延迟、可解释的轻量服务,实时感知用户行为信号(如悬停时长、输入节奏、事件缺失),结合TinyML模型与规则引擎,在800毫秒内触发幂等修复动作——如动态注入提示、隐藏失效控件、预加载资源等。它不替代前端或后端,而是构建人机协作的‘数字免疫系

didui8202的博客 439

Android设备通过蓝牙HID技术模拟键盘实现

日常生活中,各种物理遥控器和鼠标等设备,需要摆放和携带,便捷性有待考验。根据蓝牙HID特性,可以用蓝牙协议模仿键盘,来实现空中键盘等功能。

allen_xu_2012_new的博客 3907

Android8.0 在framework中添加KeyCode

       KeyCode是Android的按键代码,每个按键不管实体的还是虚拟的都对应一个int值,在/framework/base/core/java/android/view/的KeyEvent.java文件中可以查看android所有的keycode。实体的按键需要在驱动层的文件添加。如果驱动部分OK的话,当按键触发时,Android会在key上报。可用adb查看(先adb shell ...

绍春的博客 2686
上一篇: 要多研究一下健康才是啊!
下一篇: 2012新年祝辞——变与不变
andyhuabing
博客等级 码龄19年 704粉丝 165原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值