您的位置:首页 > 产品设计 > UI/UE

基于Bluetooth AVRCP Input Device分析Android Media Button Mechanism

2012-12-06 17:28 836 查看
  注:这个分析是很久之前做的了,用于分析的代码是Android 2.1 Eclair。在最新的Android 4.x中,Input相关的代码已经发生了一些变化。在Android 2.1中,Input相关的代码分散在/frameworks/base/libs/ui/和/frameworks/base/service/java/com/android/server/目录中。在Android 4.x中,这些代码被集中到了/frameworks/base/services/input/

/frameworks/base/services/java/com/android/server/input/。同时,一些文件的名字和内容也发生了变化,比如Android 2.1中的KeyInputQueue的Java层与JNI层的文件,在Android 4.x中已经被InputManager所取代;EventHub.cpp的内容发生了一定的变化。但是以下分析依然有有助于研究Android 4.x中的键盘输入事件如何转换成Android Media Button事件的,其中的关键入口是EventHub。从EventHub入手,往上层分析代码就可以追踪到Android
InputManager中的Input Event处理过程;往下层分析可以就能够抵达Linux Input Device。



    上图中蓝色的是Native code,绿色的是Java code。最顶上的Thread: InputDeviceReader是整个Input过程的控制中心(在Android 4.x中,这个thread在InputManager.cpp中)。这个thread通过EventHub::getEvent()来读Linux的/dev/input目录下的Input Devices,从而得到硬件的key input。基于一个与每个Input Device关联的key layout map,key input会被map成Android能够识别的Key
Code,比如一个AVRCP Input Device的key input值200就会被map成MEDIA_PLAY。

    需要注意的是,在EventHub::getEvnet()读Input Devices之前,需要判断Devices是否已经被打开。如果没有就需要去调用EventHub::openPlatformInput()去扫描/dev/input/下有哪些设备,然后打开这些设备并载入它们各自的key layout map(/frameworks/base/data/keyboards/ 中的*.kl文件就是用于定义key layout map的,其中的AVRCP.kl就定义了Bluetooth AVRCP Input
Device的key layout map。在Android Device的root fs中,这些.kl文件会被放在/system/usr/keylayout/目录)。这些被打开的设备的file descriptor和device_t指针会分别保存在mFDs和mDevices中。

    InputDeviceReader Thread得到Key Code之后,会交给Java层的代码来处理。最终由PhoneWindowManager.java中的interceptKeyTq()创建一个ACTION_MEDIA_BUTTON intent广播出去。(在Android 4.x中,最后一步广播MEDIA BUTTON的动作也是在PhoneWindowManager.java中,由interceptKeyBeforeQueueing()来实现的。interceptKeyBeforeQueueing()就是Android
2.1中的interceptKeyTq().)

    最后说一下创建ACRCP Input Device的函数调用过程。在/external/bluetooth/bluz/audio/control.c中,avctp_connect_cb()->init_uinput()->uinput_create()。需要注意的是,这个创建过程仅仅适用于Android 4.2之前的版本。从Android 4.2开始,Android就用Broadcom的Bluetooth stack替换了Bluez。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息