Android输入系统与Qwerty物理键盘的支持

以下内容,针对Android2.3.3~

Android的用户输入系统,自下而上,分成如下部分:
1.驱动程序:/dev/input目录下,通常时Event类型的驱动;
2.EventHub:libui的一部分,实现了对驱动程序的控制,从中获得信息;
3.KeyLayout(按键布局)和KeyCharacterMap(按键字符映射):后缀名称分别为kl和kcm;
Android系统文件中存在/build/target/board/emulator和/build/target/board/generic目录下,一般模拟器版本通过前者编译,自定义产品的编译通过后者;
4.Java框架层的处理:有KeyInputDevice等类来处理EventHub传递上来的信息,这些信息通过RawInputEvent和KeyEvent来表示。一般情况下,对于按键事件,以后者的形式传送给应用程序,而触摸屏和轨迹球事件以前者的形式转换形成MotionEvent事件传送给应用程序;
5.Android应用程序层:通过重载onKeyDown()和onkeyUp()等方法接收KeyEvent(按键事件),通过重载onTouchEvent()和onTrackballEvent()等方法接收MotionEvent(运动事件);

对于Android模拟环境,使用命令getevent调试Event设备:

# getevent
add device 1: /dev/input/event1
name: “eGalax Touch Screen”
add device 2: /dev/input/event4
name: “tegra Wired Accessory Jack”
add device 3: /dev/input/event3
name: “Logitech USB Keyboard”
add device 4: /dev/input/event2
name: “Logitech USB Keyboard”
add device 5: /dev/input/event0
name: “gpio-keys”

点击物理键盘按键”1”:

/dev/input/event2: 0004 0004 0007001e
/dev/input/event2: 0001 0002 00000001
/dev/input/event2: 0000 0000 00000000
/dev/input/event2: 0004 0004 0007001e
/dev/input/event2: 0001 0002 00000000
/dev/input/event2: 0000 0000 00000000

点击软键盘:

/dev/input/event1: 0003 0039 00000000
/dev/input/event1: 0003 0030 00000001
/dev/input/event1: 0003 0035 00000114
/dev/input/event1: 0003 0036 00000461
/dev/input/event1: 0003 0032 00000000
/dev/input/event1: 0000 0002 00000000
/dev/input/event1: 0000 0000 00000000
……

注:上述字串中,第二个数字串就是按键的扫描码,第一个数字串表示设备类型,第三个数字串表示按下、抬起等附加信息。

触摸屏上报的是坐标、按下、抬起等信息,相比而言,按键处理的过程稍微复杂一些,按键的表示从驱动层到Android的java层需要经过两次转化:

键扫描码Scancode ——按键标签KeycodeLabel——按键码keycode

相关程序源码:
1.external/qemu/linux_keycodes.h
Android系统按键数值的定义;
2.external/qemu/android/keycode.h
键扫描码的定义;
3.frameworks/base/include/ui/KeycodeLabels.h
字符串到整型的映射关系,此处完成的工作是从keycodelable到keycode的转化;
4.frameworks/base/core/java/android/view/KeyEvent.java
定义KeyEvent类,其中定义是整型数字和KeycodeLabels.h内定义的整型相对应;作为平台的API供Java应用程序使用;
5.frameworks/base/core/res/res/values/attrs.xml
对应的部分和此处有关联,添加或修改按键时需要关注到该文件;
6.external/webkit/WebCore/platform/mac/KeyEventMac.mm

配置文件:
KL(KeyLayout):按键布局文件
主要包括:trunk/sdk/emulator/keymaps/qwerty.kl和AVRCP.kl,前者为全键盘布局文件,后者用于多媒体控制;另外,前者的定义文件
KCM(KeyCharacterMap):按键字符映射文件
实现了键扫描码Scancode 到按键标签KeycodeLabel的映射,也就是上面提到的两次转化的第一次转化;

另外,因为Android已经定义了完整的标准按键,故一般不需要为Android系统添加按键,只需要根据KL文件配置按键即可。

Android系统中,对于物理键盘的支持,并没有做到对全键盘各个按键的支持,例如:KeyEvent.KEYCODE_GRAVE就是一个无效按键。在模拟器上,这个按键是正常的,但是,在实体机器上,keycode返回0,是一个无效按键。或许这是公司下层驱动的问题,权当抛砖引玉了……
那么,怎么来启动这个按键呢?
通过,上面提到的getevent命令,可以获得该按键的扫描码为“0029”,也就是十进制的41。
1. external/qemu/android/keycode.h中“kKeyCodeGrave = 399”修改为“kKeyCodeGrave = KEY_GRAVE”,这样还是不能达到目的;
2. external/webkit/WebCore/platform/android/ KeyEventAndroid.cpp
函数static int windowsKeyCodeForKeyEvent(unsigned int keyCode)中添加如下代码:

case AKEYCODE_GRAVE:
return VK_OEM_3;

3. trunk/sdk/emulator/keymaps/qwerty.kl
第一行“key 399 GRAVE”修改为“key 41 GRAVE”

注:此处不再粘贴源码,相信需要的人对照源码阅读不在话下,不需要的,可以飘过了……

Tags: Input Inputmethod Qwerty | Views 1,637

Tell Me What You're Thinking... 
And Welcome Back XiaoHang!

Name (required)

小折叠手机变身老式掌上电脑,Clicks推出新款外置QWERTY键盘 而且,Clicks还非常贴心地为这款键盘推出了多种配色,除了经典的红、蓝、黑等低调稳重的颜色外,还有一款超级吸睛的黄紫配色,名字也很有意思,叫做“Surge”,这配色往那一堆手机配件里一放,简直就是人群中的“显眼包”,瞬间就能抓住你的眼球。每个按键的大小和间距都设计得恰到好处,手指按上去的触感十分舒适,反馈力度也刚刚好,每一次按键都能让你感受到那种实实在在的“机械感”,就像是在弹奏一首美妙的乐章,这可比在虚拟键盘上戳来戳去有感觉多了。相信我,当你第一次使用它的时候,你就会被它深深吸引,从此爱不释手。 阅读详情

相关推荐

Android8.1】软键盘和实体键盘冲突(无法同时使用)问题解决

Android系统上存在一个机制,即当系统外接实体键盘时候,软键盘则会默认被禁用,要想实现软键盘和实体键盘同时使用,则需要进行如下操作: vi frameworks/base/packages/SettingsProvider/res/values/defaults.xml 对 def_show_ime_with_hard_keyboard 进行初值修改,由false->true,如下所示: 延伸阅读: frameworks/base/packages/SettingsProvider/src/

wang 恒 的博客 2518

Android keycode 列表(稍全)

信息来源:http://developer.android.com/reference/android/view/KeyEvent.html KEYCODE_0 '0' key. 7 KEYCODE_1 '1' key. 8 KEYCODE_2 '2' key. 9 KEYCODE_3 '3' key. 10 KEYCODE_4

可口可乐的博客 878

android 按键映射qwerty.kl文件中的WAKE和WAKE_DROPPED的定义

android系统中,获取到键盘的键值后,会搜索/system/usr/keylayout/gpio-keys.kl这个文件 key 115   VOLUME_UP         WAKE_DROPPED key 114   VOLUME_DOWN       WAKE_DROPPED key 102   HOME              WAKE 如果code其中的键值相对

1万+

Android按键分析

Android按键分析 按键的驱动可以在linux内核的平台文件中找到(arch/arm/mach-xxx)下的button-xxx.c 或 mach-xxx.c 这里主要讲android事件的处理过程,需要经过两个转换步骤:  按键码KeyCode -- (整型数)[按键码转换] 1、键扫描码ScanCode是由linux的Input驱动框架定义的整数类

jvaemape的专栏 940

adb shell 摇一摇_adb shell命令模拟按键/输入input使用keycode 列表详解

/**Key code constant: Unknown key code.*/public static final int KEYCODE_UNKNOWN = 0;/**Key code constant: Soft Left key.* Usually situated below the display on phones and used as a multi-func...

weixin_39842519的博客 1619

android wear 最新设备,最全Android Wear 2.0设备升级名单:华为给力

原标题:最全Android Wear 2.0设备升级名单:华为给力谷歌在前不久的I/O大会上正式公布了Android Wear 2.0,UI方面进行了不小的调整。 首先,新系统拥有全新的深色UI和转盘式桌面,深度整合物理按键功能、更好地适应圆形表盘。其次,Android Wear 2.0系统加入了QWERT全键盘和手写,以及短信回复建议功能,提升了第三方应用兼容性。最后,Android Wear ...

weixin_36165398的博客 3585

Android 键盘

本文介绍了Android开发物理键盘键盘的区别及处理方法。物理键盘指实体键盘输入响应快且支持快捷键;软键盘是虚拟键盘,功能丰富但占用屏幕空间。系统默认在有物理键盘时隐藏软键盘,但开发者可通过Configuration和InputDevice检测键盘状态,使用InputMethodManager控制软键盘显示/隐藏。文中提供了键盘状态检测、软键盘控制、USB设备监听等完整代码实现,帮助开发者根据设备状态自动切换键盘输入方式,优化用户体验。关键点包括键盘类型判断、广播监听配置变化以及高级的USB设备连接

Mark Wu 的博客 1622

android 输入法 suretype,没输入法的年代,黑莓都有哪些经典键盘

在那个还是功能机当道、智能手机霸主还是诺基亚的年代,黑莓也曾在北美手机市场叱咤风云,除了BES/BIS邮件推送服务,其适合英文输入键盘设计,更是在那个不太完善的社交网络上深受消费者喜爱。至于国内即使邮件推送服务不普及,但商务范的形象和像电脑般智能的外观也吸引不少小资、手机玩家的青睐。综合来看,国内外的黑莓用户、粉丝都大多被黑莓的键盘所吸引,黑莓在物理键盘上的设计即使不是登峰造极,也足够炉火纯青,...

weixin_35496861的博客 644

Android 连接键盘时,无法唤出虚拟键盘系统代码分析解决

Android连接键盘时虚拟键盘显示问题解决方案 问题现象:Android设备连接物理键盘后,虚拟键盘不再自动弹出,影响需要同时使用两种输入方式的场景。 原因分析: 系统默认设计:检测到物理键盘连接时自动隐藏虚拟键盘 关键控制参数:Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD(默认值为false) 判断逻辑位于InputMethodManagerService和InputMethodService中 解决方案: 修改默认值(推荐): 修改frameworks/

wenzhi的博客 4089

【转】Android-Input 键盘设备

https://source.android.com/devices/input/keyboard-devices 键盘设备 Android 支持各种键盘设备,包括特殊功能小键盘(音量和电源控制),紧凑型嵌入式 QWERTY 键盘和全能型 PC 式外接键盘。 本文档仅介绍物理键盘。有关软键盘输入法编辑器)的信息,请参阅 Android SDK。 键盘分类 只要满足以下条件之一,输入...

weixin_30519071的博客 3943

android外设按键,Android 外接键盘的按键处理

Android是默认支持键盘的,但是支持的不够好,所以需要我们自己根据自己的键盘来修改。Android键盘的默认配置路径是sdk/emulator/keymaps有两个最重要的文件:qwerty.kl 默认的KeyLayout文件,是映射键盘物理矩阵的ScanCode到系统的KeyCode的一个关系。这个需要我们事先知道我们的键盘矩阵值。如果厂家不提供,就自己一个一个Log打印。这个文件的格式,很...

weixin_42359449的博客 1714

AnySoftKeyboard:完全自定义的Android键盘终极指南

作为Android用户,您是否厌倦了千篇一律的键盘体验?AnySoftKeyboard为您带来了全新的个性化输入解决方案。这款开源键盘应用支持超过70种语言,提供无限的自定义可能性,让您的输入体验真正独一无二。 ## ✨ 项目亮点速览:重新定义键盘体验 - **多语言支持**:从英语、德语到阿拉伯语、日语,覆盖全球主流语言 - **完全自定义**:从布局、主题到按键效果,一切由您掌控 - **

gitblog_00021的博客 1114

android外设按键,Android 外接键盘的按键处理 .

Android是默认支持键盘的,但是支持的不够好,所以需要我们自己根据自己的键盘来修改。Android键盘的默认配置路径是sdk/emulator/keymaps有两个最重要的文件:qwerty.kl 默认的KeyLayout文件,是映射键盘物理矩阵的ScanCode到系统的KeyCode的一个关系。这个需要我们事先知道我们的键盘矩阵值。如果厂家不提供,就自己一个一个Log打印。这个文件的格式,很...

weixin_36225384的博客 1351

Android输入法扩展之外接键盘中文输入

我们知道,android目前的输入都是通过软键盘实现的,用外接键盘的少.但是在平板上,外接键盘中文输入是必要的,软键盘输入还是太慢了,对于可以兼用办公的Android平板来说,实现PC级中文输入速度是比较有用的.在android上写文章,qq聊天,外接键盘是该发挥发挥了。但是早期的Android输入法的架构限制,它没法实现外接键盘中文输入,本文利用Android的某些隐蔽的属性分析并实现了一种外接键盘中文输入法。

区块链斜杠青年(爱踢门) 1万+

Halmak 键盘布局:AI设计的高效输入方案

Halmak 是一款基于人工智能设计的键盘布局,旨在通过分析现实世界中的手部运动来提高打字效率。该布局由键盘基因组项目发展而来,并在[尼古拉·涅姆希洛夫](https://github.com/MadRabbit)的博客上详细记录了其设计过程。Halmak 较之传统QWERTY布局,在效率上提高了+134%,考虑到了手指强度的对称性,优化了手指移动距离和同手同指使用的频率,特别适配于现代的英文输入...

gitblog_00018的博客 543

Android 外接键盘的按键处理

Android是默认支持键盘的,但是支持的不够好,所以需要我们自己根据自己的键盘来修改。Android键盘的默认配置路径是sdk/emulator/keymaps有两个最重要的文件:qwerty.kl 默认的KeyLayout文件,是映射键盘物理矩阵的ScanCode到系统的Ke

wike的专栏 1万+

Winlator输入控制系统深度解析:Android运行Windows应用的技术挑战解决方案

Winlator作为一款能够在Android设备上运行Windows应用程序的开源项目,其核心挑战之一就是实现跨平台的输入控制系统。在移动设备上完美模拟Windows的键盘、鼠标和游戏控制体验,需要解决从底层硬件抽象到上层应用交互的完整技术栈问题。本文将深入分析Winlator输入系统的技术架构、实现原理,并提供专业级的配置优化方案。 ## 问题定义:AndroidWindows输入系统的鸿沟

gitblog_01134的博客 436
上一篇: JNI 动态注册
下一篇: Windows 下调用shell不阻塞方法
iteye_2164
博客等级 码龄8年 0粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值