`
ouyangfeng521
  • 浏览: 248736 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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)

分享到:
评论

相关推荐

    Android自定义软键盘

    7. 数字键盘的实现:数字键盘与字母键盘类似,只需更改布局中的文本和处理逻辑。可以考虑添加切换字母/数字模式的功能,方便用户在不同输入场景间切换。 总结起来,Android自定义软键盘的关键在于创建布局资源、...

    软键盘支持中、英文输入

    这样的设计,无疑为不同语言背景的用户提供了一个便利的输入解决方案,使他们能够在没有物理键盘的设备上也能够高效、准确地输入文字。 更进一步,软键盘的可移植性是指它能够在不同的操作系统和设备上运行,这一点...

    Android键盘映射

    Android系统中的键盘映射是指系统如何将物理键盘(或虚拟键盘)上的按键与操作系统内部表示的键值进行匹配的过程。这一机制对于实现用户输入功能至关重要,同时也为开发者提供了一个灵活的方式来调整键值映射,以...

    一种基于Android内核的物理按键设计.pdf

    在本文所涉及的案例中,设备运行的是Android 6.0系统,硬件设计只考虑了支持系统功能键的物理接口。 为了增加额外的物理按键,设计者需要对硬件电路进行修改。这涉及到在电路板上添加新的按键连接,可能需要扩展...

    Android-一款智能高效简洁的桌面应用搜索工具.支持T9搜索Qwerty搜索和语音搜索.

    这种设计特别适合那些喜欢使用物理键盘或者对触摸屏输入不熟练的用户,极大地提高了搜索效率。 接下来是Qwerty搜索,这是针对全键盘设备或虚拟键盘的搜索方式。Qwerty布局源于传统电脑键盘,提供了一种更为直观和...

    界面键盘,软键盘.。。。

    1. 用户习惯:键位布局应尽可能接近用户熟悉的物理键盘,如QWERTY布局。 2. 屏幕适配:根据屏幕尺寸调整键盘大小,确保每个按键易于触击且不会遮挡太多屏幕内容。 3. 功能优化:提供常用快捷键、纠错功能、自动补全...

    PersianHardwareKeyboard:android 硬件键盘的波斯语布局

    在Android操作系统中,为了支持不同语言的用户,系统提供了对多语言输入的支持,其中包括波斯语(Persian)这样的右到左(RTL)语言。"PersianHardwareKeyboard"项目是针对Android硬件键盘的一个定制化解决方案,它...

    小工具-电脑软键盘

    当用户在屏幕上点击或触摸相应的键位时,软件会捕获这些事件并转化为键盘输入信号,然后将信号传递给操作系统,最终实现与物理键盘相同的文本输入效果。这一过程涉及到图形用户界面(GUI)编程,事件处理,以及与...

    android keymaps

    - **软键盘处理**:对于没有物理键盘的设备,Android系统会提供虚拟键盘(soft keyboard),其键映射逻辑也遵循相同的原理。 5. 输入事件的多层转换: - **硬件到软件**:硬件按键产生的信号首先由底层驱动转换为...

    瑞视羽屏幕键盘

    "瑞视羽屏幕键盘"是一款专为提升智能输入体验设计的软件工具,它将传统的物理键盘功能集成到屏幕上,使得用户无需实体键盘也能方便地进行文字输入。这款屏幕键盘的独特之处在于其集成了手写输入功能,通过一个透明...

    虚拟键盘(附源码),可以在资源管理器中模拟出一个虚拟键盘。

    虚拟键盘是一种计算机应用程序,它可以在屏幕上显示一个键盘布局,用户可以通过鼠标点击或触摸屏操作来输入文字,替代传统的物理键盘。这种技术在无物理键盘的设备如平板电脑、触摸屏设备或者某些特定场合(如安全...

    随手写的软键盘SoftKeyBoard

    软件键盘,通常用于移动设备或应用程序中,替代物理键盘输入字符。在这个项目中,开发者初次尝试创建了一个软键盘控件。 描述中提到“第一次写控件,写得很一般,不要见笑”,暗示了这是一个初学者的作品,可能在...

    caps2ctrl:为Android添加物理键盘布局,以用Ctrl替换Caps Lock

    caps2ctrl 此应用程序添加了键盘布局(英语,美国,qwerty),该布局将物理键盘的“ Caps Lock”更改为“ ... 因此,不能在制造商禁用了Android设置的“设置”->“语言和输入”->“物理键盘”的Android设备上使用它。

    软键盘实现

    此外,对于移动应用,还需要考虑软键盘与硬件键盘的协同工作。有时,用户可能同时使用物理键盘和软键盘,这就需要应用程序能够智能地处理两者之间的切换,避免冲突。 在编码实践中,通常会使用面向对象的编程语言,...

    ScreenKeyboard_软键盘_screenboard_

    屏幕键盘(Screen Keyboard)是一种虚拟键盘,主要用于在无物理键盘的设备上,如触摸屏设备或需要通过鼠标等非接触式输入方式输入文本的场景。它通常作为一个软件应用程序集成到操作系统或特定应用中,以便用户可以...

    jquery屏幕键盘插件Virtual Keyboard

    在Web应用中,特别是在移动设备或触摸屏上,有时需要为用户提供一种在浏览器内输入文本的方式,而无需物理键盘。`jQuery Virtual Keyboard`插件正是为此目的设计的,它提供了一个在浏览器内的虚拟屏幕键盘,用户可以...

    软键盘程序

    在Android系统中,软键盘是用户输入文字的重要途径,尤其在移动设备上,由于物理键盘的缺失,软键盘显得尤为重要。本项目是一个完整的Android软键盘模拟程序,它提供了详细的源代码,确保每个部分都经过了严格的测试...

    android 1.5 gi rom

    - 它引入了软键盘,使得用户在没有物理键盘的设备(如HTC G1)上也能方便地输入文本。 - 这个版本还支持视频录制和播放,增强了多媒体体验。 2. **HTC G1**: - HTC G1(也称为Dream),是首款搭载Android系统的...

    虚拟键盘源码

    虚拟键盘源码是一种用于在计算机或移动设备上模拟传统物理键盘的软件实现。它通常用于没有物理键盘的触摸屏设备,或者在特定应用场景下需要替代物理键盘的情况。虚拟键盘允许用户通过屏幕上的按键输入文本,这些按键...

    键盘处理demo

    8. **跨平台兼容性**:不同的操作系统和浏览器对键盘事件的支持可能存在差异。开发者需要测试并确保代码在Windows、MacOS、iOS、Android等平台上都能正常工作。 9. **性能优化**:大量键盘事件可能导致性能问题,...

Global site tag (gtag.js) - Google Analytics