您的位置:首页 > 移动开发 > Android开发

Android 输入系统解析 (1)

2012-07-03 17:45 344 查看
有两种思路来解析Android Input 子系统的代码(注一),一是从应用的事件获取开始,自上而下的解析Input相关代码的功能及调用关系(从
注二 的内容可知,输入事件是通过View类中的事件监听接口获取的);二是从内核驱动开始,自下而上找出调用关系;本文采用第二种思路。

1. 内核输入驱动

内核输入驱动包括两个类别协同工作的驱动,即输入设备驱动和输入事件驱动,设备驱动负责与输入的硬件设备进行通讯,而事件驱动提供供用户空间应用访问的接口(即 /dev/input/xxx 设备节点)。因为输入驱动已提供了标准化的事件接口,新写一个事件驱动相对来说较为简单,大致步骤为:

a). 初始化时调用标准函数input_allocate_device分配一个input_dev结构体并设置要产生的事件及事件码

b). 调用input_register_device来注册一个输入事件驱动

c). 调用input_report_xxx(rel/abs…)和input_sync来上报事件。



2. EventHub

应用程序获得输入事件的方法为打开输入设备节点并调用poll来查询和read来读取输入事件。在Android中,读取输入事件在 frameworks/base/services/input/EventHub.cpp中实现。EventHub类中有两个关键成员函数: openDeviceLocked和getEvents,它们的作用分别为打开设备节点和读取输入事件。

openDeviceLocked实现的具体功能为:

打开设备节点
获得设备名
检查设备是否在不支持设备之列
获得设备版本号和标识符
获得设备唯一的ID
为使用poll函数,将文件描述符设为非阻塞类型
获得设备类别(输入设备类别在EventHub.h中定义,具体如下)

INPUT_DEVICE_CLASS_KEYBOARD 键盘

INPUT_DEVICE_CLASS_ALPHAKEY 数字键盘

INPUT_DEVICE_CLASS_TOUCH 触摸屏(单点或多点)

INPUT_DEVICE_CLASS_CURSOR 光标(如轨迹球或鼠标)

INPUT_DEVICE_CLASS_TOUCH_MT 多点触摸屏

INPUT_DEVICE_CLASS_DPAD 方向键

INPUT_DEVICE_CLASS_GAMEPAD 游戏手柄

INPUT_DEVICE_CLASS_SWITCH 开关键

INPUT_DEVICE_CLASS_JOYSTICK 操纵杆

INPUT_DEVICE_CLASS_EXTERNAL 外部设备

getEvents调用read函数来读取输入设备上报的事件并直接将事件信息填充进RawEvent结构体数组缓冲区(即传入参数buffer)中。

?
注一: 本文所使用Android代码的版本为: 4.0.3

注二: http://developer.android.com/guide/topics/ui/ui-events.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: