网上蓝牙音乐相关的文章实在太少,贡献一下自己的微薄之力
先讲一些零碎知识点:
##################################华丽分割线###################################
蓝牙的源码路径
frameworks\base\core\java\android\bluetooth
##################################华丽分割线###################################
蓝牙音乐使用中需要用到的权限
在apk中的AndroidManifest.xml中要有以下语句获得蓝牙相关权限:
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
##################################华丽分割线 下面介绍蓝牙的广播部分 start###############################
蓝牙的广播部分
蓝牙的连接
注册蓝牙回调,这里需要讲一下BluetoothAdapter、BluetoothAvrcpController、BluetoothA2dpSink三个类
BluetoothAdapter作用:
获取蓝牙开关状态,搜索蓝牙,配对蓝牙等
BluetoothAvrcpController作用:
这个类里主要是维护蓝牙音乐的相关信息更新(ID3),操作控制蓝牙音乐(播放暂停上一曲下一曲等)
BluetoothA2dpSink 作用:
这个类里主要是确定蓝牙音乐是否连接上
注册蓝牙回调广播
public void registerBtReceiver(Context context) {
IntentFilter intentFilter = new IntentFilter();
//A2DP连接状态改变
intentFilter.addAction(BluetoothA2dpSink.ACTION_CONNECTION_STATE_CHANGED);
//A2DP播放状态改变
intentFilter.addAction(BluetoothA2dpSink.ACTION_PLAYING_STATE_CHANGED);
//监听蓝牙音乐暂停、播放等
intentFilter.addAction(BluetoothAvrcpController.ACTION_TRACK_EVENT);
//连接状态
intentFilter.addAction(BluetoothAvrcpController.ACTION_CONNECTION_STATE_CHANGED);
//浏览
intentFilter.addAction(BluetoothAvrcpController.ACTION_BROWSE_CONNECTION_STATE_CHANGED);
// 正在浏览的事件
intentFilter.addAction(BluetoothAvrcpController.ACTION_BROWSING_EVENT);
//当前 媒体 项目 改变
intentFilter.addAction(BluetoothAvrcpController.ACTION_CURRENT_MEDIA_ITEM_CHANGED);
intentFilter.addAction(BluetoothAvrcpController.ACTION_PLAYER_SETTING);
//没有媒体信息
intentFilter.addAction(BluetoothAvrcpController.ACTION_PLAY_FAILURE);
intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
intentFilter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
intentFilter.addAction(BluetoothDevice.ACTION_NAME_CHANGED);
context.registerReceiver(mBtReceiver, intentFilter);
}
注册完回调以后,会有一个回调函数
private BroadcastReceiver mBtReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getAction()) {
case BluetoothA2dpSink.ACTION_CONNECTION_STATE_CHANGED:
//todo 主要处理蓝牙a2dp连接状态
break;
case BluetoothA2dpSink.ACTION_PLAYING_STATE_CHANGED:
LogUtil.e(TAG, "mBtReceiver,
//控制蓝牙的播放状态,启动这个作为播放状态更新,时序太慢,所以注意不要用这个回调更新播放状态,建议在BluetoothAvrcpController.ACTION_TRACK_EVENT回调中处理播放状态
break;
case BluetoothAvrcpController.ACTION_CONNECTION_STATE_CHANGED:
break;
case BluetoothAvrcpController.ACTION_TRACK_EVENT:
//处理媒体信息,包括需要显示的MediaMetadata基本信息,和实时更新的PlaybackState信息
break;
case BluetoothAvrcpController.ACTION_BROWSE_CONNECTION_STATE_CHANGED:
// 手机端断开并重新连接上需要更新
break;
case BluetoothAvrcpController.ACTION_BROWSING_EVENT:
//蓝牙音乐列表
break;
case BluetoothAvrcpController.ACTION_CURRENT_MEDIA_ITEM_CHANGED:
//广播得到媒体信息
BluetoothAvrcpMediaItemData mMeidaItemData = intent.getParcelableExtra(BluetoothAvrcpController