Android怎样监听蓝牙耳机的按键事件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android怎样监听蓝牙耳机的按键事件相关的知识,希望对你有一定的参考价值。

参考技术A 试用后会明白,一个按键会有多个功能,那么在android系统中是如何表示的呢?其实对于Android系统,每次按键只会有一个唯一「键值」响应,使用起来感觉会模模糊糊的,但是其实对于系统来说是很清晰的。
AVRCP全称(Audio/Video Remote Control Profile),是蓝牙协议中的一个profile。从名字上就可以看出主要应用于Audio/Video控制。每个按键并不是独立的,上-曲/下一曲是在正在播放音乐的时候才会有效,即才会向Android发送「键值」。
基于按键从Linux到Android分析具体对于的键值:
Linux扫描码 功能 映射字串 Android键值
00c8 200 开始放音乐 MEDIA_PLAY KEYCODE_MEDIA_PLAY
00c9 201 停止放音乐 MEDIA_PAUSE KEYCODE_MEDIA_PAUSE
00a3 163 下一曲 MEDIA_NEXT KEYCODE_MEDIA_NEXT
00a5 165 上-曲 MEDIA_PREVIOUS KEYCODE_MEDIA_PREVIOUS
Android应用代码,完整测试应用:TeskKey。
总结:1号键会交替发送KEYCODE_MEDIA_PLAY/KEYCODE_MEDIA_PAUSE;2/3号键会在播放音乐时分别发送KEYCODE_MEDIA_PREVIOUS/.KEYCODE_MEDIA_NEXT。如果想要把蓝牙耳机上的按键利用起来,可以在接收到KEYCODE_MEDIA_PLAY时播放 无声音乐 以使能2/3号键。这样就能完整接收3种键值了自行控制了。这个具体自行设计(测试代码已经更新包含了)。

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的值,修改如下

修改后重启就发现已经起作用了。

3.1 添加kl

如果你使用 dumpsys input 拿到的 kl 是 General.kl ,说明你的遥控器并没有被添加进去,kl 的添加需要知道 vendorID 和 productID。
首先,先进入在/system/usr/keylayout,通过cat /proc/bus/input/devices 拿到input信息。
且从上面知道,我们的蓝牙是 input4 ,所以,可以拿到信息:

所以,需要添加的文件未 Vendor_000d_Product_3838.kl,放到 frameworks/base/data/keyboards 即可。

四. 添加新的按键值

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怎样监听蓝牙耳机的按键事件的主要内容,如果未能解决你的问题,请参考以下文章

Android监听耳机按键事件

Android接收蓝牙多媒体按键事件的bug

如何捕获android系统按键事件

uniapp识别蓝牙耳机按键

Android基础——物理按键,长按,触摸事件及其监听器

onBackPressed() 监听返回按键事件