Android(安卓)上从外部应用注入按键事件流程分析
一般大家都习惯通过内核驱动增加linux的输入设备,实际linux也提供了通过非内核方式添加输入设备的方法,通过这些方法增加的输入设备对其他要求输入的应用几乎透明,进而可以容易扩展内核的输入方法。这里以android上蓝牙avrcp控制为例子,说明外部的蓝牙控制按键如何传给android的。
蓝牙avrcp收到蓝牙按键的处理在extern/bluetooth/audio/control.c文件中。该文件初始化时候就会打开/dev/uinput的设备节点,该节点是内核专门用于扩展上层用户输入的接口。Avrcp打开设备节点后就按照操作uinput的标准方式注册一个新的输入设备。详细的uinput使用方法可以参看UsinguinputdriverinLinux-
2.6.xtosenduserinput(http://www.einfochips.com/download/dash_jan_tip.pdf)注册完成后就开始接受外部蓝牙设备的控制按键信息并转换为本地按键值发送给内核。
从内核方面讲,会按照外部应用请求创建新的输入设备,比如/dev/input/eventX,这里的X根据实际情况变动。
对于android而言,上面动态增加的输入设备必须能够做到实时监控并加入输入设备列表,做到这一点是通过在eventhub.cpp的初始化openPlatformInput时候注册监听/dev/input目录的变化,注册的方法是通过inotify_xxx系列完成,注册的方法可以参看:如何使用inotify_init,inotify_add_watch,inotify_rm_watch,read编写监控程序
http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201011209823241/
注册完成后每次在方法getEvent中都会去readNotify,进而做出添加或删除输入设备的动作。这样就完成对avrcp扩展输入的支持工作。
国外有人做了一个通过pc输入按键给android的方法,有兴趣的人可以参看:
http://www.math.bme.hu/~morap/RemoteInput/
更多相关文章
- android HAL层代码
- android 蓝牙隐藏对话框 后台配对
- 【Android】常用的adb命令
- android监听Key事件
- Android(安卓)EditText输入最大长度限制如何给用户以友好的提示
- Android(java)学习笔记97:Scanner类使用
- Android避免进入一页面后EditText自动弹出软键盘
- Android(安卓)使用 Batterystats 和 Battery Historian 分析电池
- MAC和Windows Android(安卓)Studio获取SHA1值