Android接收蓝牙多媒体按键事件的bug
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android接收蓝牙多媒体按键事件的bug相关的知识,希望对你有一定的参考价值。
参考技术Aandroid手机连接上一台蓝牙键盘之后,进入app界面(我的app界面,简称A),点击蓝牙键盘上的音乐播放、上一曲、下一曲等多媒体键,需要app能收到这些键,其它音频播放器(简称B)收不到;当不在A界面之后(后台或者杀死),需要B可以收到。
在app的Activity放入onKeyDown中获取键值
问题
这种情况下,A在前台时,A可以收到键值,B也可以收到,可以响应蓝牙的播放、暂停等操作。要求此时B不能收到。
使用MediaButtonReceiver,注册独占广播,监听MediaButton事件。
http://blog.csdn.net/qinjuning/article/details/6938436
问题
B在播放或者暂停、A在前台的情况下,此时A收不到,B能收到。
http://blog.csdn.net/ocwvar/article/details/53107005
考虑到之间的函数已经过期,而我的测试机版本为6.0,所以改用MediaSessionCompat来实现。
问题
还是某些情况下,A在前台收不到,B在后台可以收到。
并且此时,onKeyDown中有log打印,onKeyUp中没有。
当不运行B,只启动A时,A可以正常收到。
此时,onKeyDown和onKeyUp中都有打印。
三种方案都有问题的时候,在官网的文档上找到了原因:
https://developer.android.google.cn/guide/topics/media-apps/mediabuttons.html?#foreground-activity
前台进程会在onkeydown中接收到media buttons的key event
所以,方案2、3都属于有多个session,但是A属于stopped的session,故不能接收到media button的event。
采用3.1中的策略,在前台activity的onkeydown中返回ture的方式去处理event。
今天google用不了,导致试了多种方法都有问题。最后还是在官方文档里面找到答案。
官方文档的重要性,再一次得到了体现。
Android 添加蓝牙遥控按键
一. 蓝牙遥控器的原理
本文源码给予 amlogic 9.0
蓝牙遥控器的原理如下图
从流程上我们可以发现,我们遥控器的码值被转化了几次: HID码值–→Linux event–→ 根据Vendor、Product转化为Android事件。
二. 按键知识
适配可以发现,一些按键不可用,说明按键值为添加和适配。
通过 getevent 可以拿到其中一个按键的值:
**
**
从上图可以知道
- 名字:蓝牙遥控器的名字为 BT_Smart_RC001
- 007004a :其中,高位为 usage page (07代表普通健,0c 代码多媒体健);低位为健值
- 0066:表示down的值,这个后面需要在 kl 文件中,转换成十进制的值
三. 修改已有按键值
现象:BT_Smart_RC001 这个遥控器,按下Back 建,HOME 建不起作用。
先使用 getevent 按下Back健,拿到event 的值
这种通用的按键,在KeyEvent 是有的,我们要做的,就是修改 kl 的值即可。
使用 dumpsys input 拿到 kl 的位置:
可以看到 kl 在 Android 系统映射的位置,修改里面的值,0x9e 转成十进制为 158,同理拿到HOME的值,修改如下
修改后重启就发现已经起作用了。
四. 添加新的按键值
BT_Smart_RC001 有个按键0X59,我们想把它定义为新的健,所以需要走一遍按键添加流程;
5.1 添加键值和上层映射
去到 linux 映射表,hid-input.c ,位置在 common/drivers/hid/hid-input.c ,去到 HID_UP_CONSUMER 这个方法,把0x59 添加进去,并新增 KEY_SOURCE 这个字符串,后续给Android使用的
5.2 头文件中添加字符串
去到 common/include/uapi/linux/input-event-codes.h ,添加刚才的KEY_SOURCE,注意不要重复即可
5.3 framework 的 KeyCodes.h , InputEventLabels.h 和KeyEvent.java
去到 frameworks/native/include/android ,在 KeyCodes.h 增加刚才的SOURCE,注意不要重复即可
然后再去到 frameworks/native/include/input,修改 InputEventLabels.h,定义刚才的source
最后,再去到 frameworks/base/core/java/android/view , 修改给Android 上层使用的 KeyEvent.java 即可:
这里,我们的按键值,就从 linux 传到 KeyEvent.java 了。
五. PhoneWindowManager 添加按键功能
接下来就是处理自己的功能了,此时按键已经通过 onKeyEvent()拿到,如果你想全局处理,可以在 PhoneWindowManager 的
interceptKeyBeforeQueueing 方法添加功能,如:
这样,新建一个按键就完成了
以上是关于Android接收蓝牙多媒体按键事件的bug的主要内容,如果未能解决你的问题,请参考以下文章