Android : 输入设备键值从底层到应用层的映射流程

2024-06-07 15:18

本文主要是介绍Android : 输入设备键值从底层到应用层的映射流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android : 输入设备键值从底层到应用层的映射流程

一、Android输入子系统简介:

  Android输入事件的源头是位于/dev/input/下的设备节点,而输入系统的终点是由WMS管理的某个窗口。最初的输入事件为内核生成的原始事件,而最终交付给窗口的则是KeyEvent或MotionEvent对象。因此Android输入系统的主要工作是读取设备节点中的原始事件,将其加工封装,然后派发给一个特定的窗口以及窗口中的控件。这个过程由InputManagerService(以下简称IMS)系统服务为核心的多个参与者共同完成。

                        图1:输入系统的总体流程与参与者

 

二、键值映射关系:

    ①IR硬件扫描码在驱动里面被映射为 include/uapi/linux/input.h 里面定义的某个键值,但这个键值只在linux系统(内核)中使用。
  ②Android通过源码目录下的 device/xxx/xxx.kl(keylayout) 文件完成linux键值到Android系统要使用的键值映射。

 

  以HID设备为例,首先内核中的键值转换在drivers/hid/hid-input.c 中进行映射,键值通道也有多种类型,例如:keyboard、consumer 等等;

  //keyboard通道键值则是在如下数组添加修改:

复制代码

static const unsigned char hid_keyboard[256] = {0,  0,  0,  0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38,50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44,  2,  3,4,  5,  6,  7,  8,  9, 10, 11, 28,  1, 14, 15, 57, 12, 13, 26,27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64,65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106,105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71,72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190,191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113,115,114,unk,unk,unk,121,unk, 89, 93,124, 92, 94, 95,unk,unk,unk,122,123, 90, 91, 85,unk,unk,unk,unk,unk,unk,unk,111,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,179,180,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,111,unk,unk,unk,unk,unk,unk,unk,29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113,150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk
};......//然后在以下代码部分使用:case HID_UP_KEYBOARD:set_bit(EV_REP, input->evbit);if ((usage->hid & HID_USAGE) < 256) {if (!hid_keyboard[usage->hid & HID_USAGE]) goto ignore;map_key_clear(hid_keyboard[usage->hid & HID_USAGE]);} elsemap_key(KEY_UNKNOWN);break;

复制代码

 //consumer通道键值则是在如下添加修改:

复制代码

case HID_UP_CONSUMER:    /* USB HUT v1.12, pages 75-84 */switch (usage->hid & HID_USAGE) {case 0x000: goto ignore;case 0x030: map_key_clear(KEY_POWER);        break;case 0x031: map_key_clear(KEY_RESTART);        break;case 0x032: map_key_clear(KEY_SLEEP);        break;case 0x034: map_key_clear(KEY_SLEEP);        break;case 0x035: map_key_clear(KEY_KBDILLUMTOGGLE);    break;case 0x036: map_key_clear(BTN_MISC);        break;case 0x040: map_key_clear(KEY_MENU);        break; /* Menu */case 0x041: map_key_clear(KEY_SELECT);        break; /* Menu Pick */case 0x042: map_key_clear(KEY_UP);        break; /* Menu Up */case 0x043: map_key_clear(KEY_DOWN);        break; /* Menu Down */case 0x044: map_key_clear(KEY_LEFT);        break; /* Menu Left */case 0x045: map_key_clear(KEY_RIGHT);        break; /* Menu Right */case 0x046: map_key_clear(KEY_ESC);        break; /* Menu Escape */case 0x047: map_key_clear(KEY_KPPLUS);        break; /* Menu Value Increase */case 0x048: map_key_clear(KEY_KPMINUS);        break; /* Menu Value Decrease */case 0x060: map_key_clear(KEY_INFO);        break; /* Data On Screen */case 0x061: map_key_clear(KEY_SUBTITLE);    break; /* Closed Caption */case 0x063: map_key_clear(KEY_VCR);        break; /* VCR/TV */case 0x065: map_key_clear(KEY_CAMERA);        break; /* Snapshot */case 0x069: map_key_clear(KEY_RED);        break;case 0x06a: map_key_clear(KEY_GREEN);        break;case 0x06b: map_key_clear(KEY_BLUE);        break;case 0x06c: map_key_clear(KEY_YELLOW);        break;case 0x06d: map_key_clear(KEY_ZOOM);        break;case 0x082: map_key_clear(KEY_VIDEO_NEXT);    break;case 0x083: map_key_clear(KEY_LAST);        break;case 0x084: map_key_clear(KEY_ENTER);        break;case 0x088: map_key_clear(KEY_PC);        break;case 0x089: map_key_clear(KEY_TV);        break;case 0x08a: map_key_clear(KEY_WWW);        break;case 0x08b: map_key_clear(KEY_DVD);        break;case 0x08c: map_key_clear(KEY_PHONE);        break;case 0x08d: map_key_clear(KEY_PROGRAM);        break;case 0x08e: map_key_clear(KEY_VIDEOPHONE);    break;case 0x08f: map_key_clear(KEY_GAMES);        break;case 0x090: map_key_clear(KEY_MEMO);        break;case 0x091: map_key_clear(KEY_CD);        break;case 0x092: map_key_clear(KEY_VCR);        break;case 0x093: map_key_clear(KEY_TUNER);        break;case 0x094: map_key_clear(KEY_EXIT);        break;case 0x095: map_key_clear(KEY_HELP);        break;case 0x096: map_key_clear(KEY_TAPE);        break;case 0x097: map_key_clear(KEY_TV2);        break;case 0x098: map_key_clear(KEY_SAT);        break;case 0x09a: map_key_clear(KEY_PVR);        break;case 0x09c: map_key_clear(KEY_CHANNELUP);    break;case 0x09d: map_key_clear(KEY_CHANNELDOWN);    break;case 0x0a0: map_key_clear(KEY_VCR2);        break;case 0x0b0: map_key_clear(KEY_PLAY);        break;case 0x0b1: map_key_clear(KEY_PAUSE);        break;case 0x0b2: map_key_clear(KEY_RECORD);        break;case 0x0b3: map_key_clear(KEY_FASTFORWARD);    break;case 0x0b4: map_key_clear(KEY_REWIND);        break;case 0x0b5: map_key_clear(KEY_NEXTSONG);    break;case 0x0b6: map_key_clear(KEY_PREVIOUSSONG);    break;case 0x0b7: map_key_clear(KEY_STOPCD);        break;case 0x0b8: map_key_clear(KEY_EJECTCD);        break;case 0x0bc: map_key_clear(KEY_MEDIA_REPEAT);    break;case 0x0b9: map_key_clear(KEY_SHUFFLE);        break;case 0x0bf: map_key_clear(KEY_SLOW);        break;case 0x0cd: map_key_clear(KEY_PLAYPAUSE);    break;case 0x0e0: map_abs_clear(ABS_VOLUME);        break;case 0x0e2: map_key_clear(KEY_MUTE);        break;case 0x0e5: map_key_clear(KEY_BASSBOOST);    break;case 0x0e9: map_key_clear(KEY_VOLUMEUP);    break;case 0x0ea: map_key_clear(KEY_VOLUMEDOWN);    break;case 0x0f5: map_key_clear(KEY_SLOW);        break;case 0x182: map_key_clear(KEY_BOOKMARKS);    break;case 0x183: map_key_clear(KEY_CONFIG);        break;case 0x184: map_key_clear(KEY_WORDPROCESSOR);    break;case 0x185: map_key_clear(KEY_EDITOR);        break;case 0x186: map_key_clear(KEY_SPREADSHEET);    break;case 0x187: map_key_clear(KEY_GRAPHICSEDITOR);    break;case 0x188: map_key_clear(KEY_PRESENTATION);    break;case 0x189: map_key_clear(KEY_DATABASE);    break;case 0x18a: map_key_clear(KEY_MAIL);        break;case 0x18b: map_key_clear(KEY_NEWS);        break;case 0x18c: map_key_clear(KEY_VOICEMAIL);    break;case 0x18d: map_key_clear(KEY_ADDRESSBOOK);    break;case 0x18e: map_key_clear(KEY_CALENDAR);    break;case 0x191: map_key_clear(KEY_FINANCE);        break;case 0x192: map_key_clear(KEY_CALC);        break;case 0x193: map_key_clear(KEY_PLAYER);        break;case 0x194: map_key_clear(KEY_FILE);        break;case 0x196: map_key_clear(KEY_WWW);        break;case 0x199: map_key_clear(KEY_CHAT);        break;case 0x19c: map_key_clear(KEY_LOGOFF);        break;case 0x19e: map_key_clear(KEY_COFFEE);        break;case 0x1a6: map_key_clear(KEY_HELP);        break;case 0x1a7: map_key_clear(KEY_DOCUMENTS);    break;case 0x1ab: map_key_clear(KEY_SPELLCHECK);    break;case 0x1ae: map_key

这篇关于Android : 输入设备键值从底层到应用层的映射流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039536

相关文章

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

Nginx、Tomcat等项目部署问题以及解决流程

《Nginx、Tomcat等项目部署问题以及解决流程》本文总结了项目部署中常见的four类问题及其解决方法:Nginx未按预期显示结果、端口未开启、日志分析的重要性以及开发环境与生产环境运行结果不一致... 目录前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在