转眼间,在XX音乐(国内著名音乐APP公司)工作了1年多了,作为Android多媒体开发的主力,必须奉上一点知识了。
今天,先说一下android播放音乐时如何在蓝牙设备上显示歌曲名、歌手、专辑等信息的。
在那个风和日丽、鸟语花香的日子,突然客服Miss Hu发来一个消息,问我说,有用户反馈说在车载蓝牙上播放歌曲看不到歌曲名、歌手、专辑等信息。
我当时虽然不是一脸懵逼,但对这个问题而言确实是只知其一不知其二。
其一,代码中并没有任何直接与蓝牙相关的任何操作;
其二,真不清楚如何控制蓝牙显示的。于是乎,开始深入这个问题......
一、首先,讲一下Android上面蓝牙的部分规范。
截止到现在,世界上已经发布了约40个蓝牙应用规范。先介绍一下最常用的2个。分别是:
1.Advanced Audio Distribution Profile 简称为A2DP(高质量音频分发规范)定义了如何将立体声质量的音频通过流媒体的方式从媒体源传输到接收器上,A2DP有两种应用场景分别是播放和录音。
2.Audio Video Remote Control Profile 简称为AVRCP,定义了蓝牙设备和audio/video控制功能通信的特点和过程。该Profile定义了AV/C数字命令控制集。命令和信息通过AVCTP协议进行传输。
也就是说,连接蓝牙耳机的时候一般使用A2DP协议,而控制和显示通过AVCTP协议实现。
上图来自Google I/O 2013 - Best Practices for Bluetooth Development
那么谷歌是怎么推荐通过Avrcp在蓝牙设备上显示歌曲信息的呢?请看下图
顺便附上视频链接,分秒都给你seek到了,看不了youtube的自己想办法
https://www.youtube.com/watch?v=EC5-cEbr520&feature=youtu.be&t=25m18s
二、那我们去深入一下RemoteControlClient和Avrcp (此时已是身不由己)
RemoteControlClient enables exposing information meant to be consumed by remote controls capable of displaying metadata, artwork and media transport control buttons.
RemoteControlClient暴露信息给具有遥控功能的显示媒体、艺术品和按钮控制设备。(请忽略本人的翻译不准确性)
根据谷歌的说法,先往AudioManager里面注册一个RemoteControlClient实例,然后获取MetaDataEditor,往里面填充信息,然后执行MetaDataEditor.apply(),就是这么easy;
MetaDataEditor是什么? 这个不要问了,随便瞟两眼就知道了。
那么apply里面做了什么呢?
先看一下Android 4.3的源码,这里为什么先说这个版本,因为5.0系统与这个不一样,后面再详细解释。
apply里面根据参数不同,执行了不同的代码,我们只看sendMetadata_syncCacheLock好了。