AVRCP子协议的作用是支持CT控制TG,具体来说如果手机和一个蓝牙音箱设备连接上了,那么音箱可以控制手机播放/暂停/切歌以及获得手机上播放歌曲的信息,如专辑,歌名,歌手,时长等信息。iphone对信息获取支持较为完善,安卓手机差异性比较大,且支持的没有iphone好。
Audio/Video Remote Control Profile(AVRCP)定义了蓝牙设备和audio/video控制功能通信的特点和过程。该Profile定义了AV/C数字命令控制集。命令和信息通过AVCTP(Audio/Video Control Transport Protocol)协议进行传输。浏览功能通过AVRCTP的第二个channel而不是AV/C。传输媒体信息通过基于OBEX协议的BIP(Bluetooth Basic Imaging Profile)协议。
Audio/Video Remote Control Profile 依赖
Profile栈
CT(controller)设备:通过发送命令帧到目标发起传输。如PC,PDA,电话, 车载系统,耳机,播放/录音设备
TG(target)设备:接收命令并按命令响应的设备,如播放/录音设备,电视,耳机等。
分为四类设备
支持播放或者录音设备的基本操作
视频监视器或者音频放大器的基本操作
音视频调谐器的基本操作
这四类设备都需要支持歌曲控制功能。
这里歌曲控制罗列比较通用的功能。
播放/暂停/停止/前一首/下一首。
public static final int PASSTHROUGH_ID_PLAY = 0x44; /* play */
public static final int PASSTHROUGH_ID_STOP = 0x45; /* stop */
public static final int PASSTHROUGH_ID_PAUSE = 0x46; /* pause */
public static final int PASSTHROUGH_ID_FORWARD = 0x4B; /* forward */
public static final int PASSTHROUGH_ID_BACKWARD = 0x4C; /* backward */
上面是安卓源码定义的控制ID,想要实现控制的app代码如下:
private void sendCommand(int keyCode){
if (mAvrcpController == null)
return;
List devices = mAvrcpController.getConnectedDevices();
for (BluetoothDevice device : devices){
Log.d(TAG, "send command to device: "+ keyCode + device.getName() + " " + device.getAddress());
mAvrcpController.sendPassThroughCmd(device, keyCode, BluetoothAvrcp.PASSTHROUGH_STATE_PRESS);
mAvrcpController.sendPassThroughCmd(device, keyCode, BluetoothAvrcp.PASSTHROUGH_STATE_RELEASE);
}
}
public void onPlayButtonClick(View view){
sendCommand(BluetoothAvrcp.PASSTHROUGH_ID_PLAY);
}
它们使用的是passthrogh command,这些命令在手册有说明。
除此还有获取歌曲信息的接口,android6.0协议栈并没有实现,但是手册中有该协议command和response说明。
对应需要修改system/bt协议栈中的btif_rc.c文件,将命令封包和解包,对native和frameworks以及package层的修改框架见前一篇文章。