Android 输入系统 与 按键

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”

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android系统的ADC按键驱动主要涉及到驱动层和应用层两个方面。 驱动层: Android系统的ADC按键驱动主要是由Linux内核的Input子系统来实现的。Input子系统是Linux内核中一个用于处理输入设备的子系统,主要功能是接收来自输入设备的数据,并将其传递到应用程序。 在Android系统中,Input子系统主要负责处理键盘、鼠标、触摸屏等输入设备的数据。对于ADC按键,一般都是通过GPIO口连接到处理器上,因此需要通过驱动程序来读取GPIO口的状态,以检测按键的按下和松开。 在Linux内核中,GPIO的读取是通过sysfs文件系统实现的。因此,驱动程序需要将GPIO口的状态映射到sysfs文件系统中的一个文件,以便应用程序能够读取GPIO口的状态。 应用层: 在Android系统中,应用程序一般使用Java语言编写。对于ADC按键,应用程序可以通过Android提供的KeyEvent类来处理按键事件。 当用户按下或松开ADC按键时,Linux内核会将这个事件传递给Android系统的Input子系统。Input子系统会将这个事件转换成一个KeyEvent对象,并将其发送给应用程序。 应用程序可以通过监听KeyEvent对象来处理按键事件。当用户按下或松开ADC按键时,应用程序可以根据不同的按键事件来执行不同的操作,例如打开应用程序、切换菜单、调节音量等。 综上所述,Android系统的ADC按键驱动主要是由Linux内核的Input子系统和应用层来实现的。在驱动层,需要通过驱动程序来读取GPIO口的状态,以检测按键的按下和松开;在应用层,需要通过监听KeyEvent对象来处理按键事件,以执行不同的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值