首页 > 编程语言 >Android车载蓝牙音乐实例(附Demo源码):实现手机播放音乐后车机应用显示音乐名称,歌手,专辑名。且可控制上一曲下一曲,暂停播放功能

Android车载蓝牙音乐实例(附Demo源码):实现手机播放音乐后车机应用显示音乐名称,歌手,专辑名。且可控制上一曲下一曲,暂停播放功能

时间:2024-08-23 17:22:42浏览次数:9  
标签:MediaController 音乐 蓝牙 mMediaController 一曲 播放 连接

一、功能需求

功能需求是在Android10以上设备上实现蓝牙音乐功能,细分为两个功能点:

1、手机和车载设备实现蓝牙连接 (本Demo文只做监听蓝牙连接状态,需手动到设置中连接蓝牙)

2、连接蓝牙成功后手机播放音乐时车载设备也能播放音乐,并且在车机应用上显示音乐名称,歌手,专辑名。可在车机应用中点击播放,暂停,上一曲,下一曲控制手机端的音乐播放。

二、实现效果图

Demo地址:BluetoothMediaDemo: 实现Android10以上设备蓝牙音乐功能,Demo主要实现两步: 1、监听蓝牙连接状态 2、手机播放音乐时车载设备播放手机的音乐,并且在车机应用上显示音乐名称,歌手,专辑名。可在车机应用中点击播放,暂停,上一曲,下一曲控制手机端的音乐播放 (gitee.com)

三、代码详解

3.1、实现原理:

     安卓系统通过媒体浏览器服务已经为大家提供了一套完整的音乐控制解决方案,并进行了封装。所以音乐类应用通过媒体浏览器服务可以轻松实现音乐控制等功能

     蓝牙音乐应用根据当前系统的安卓版本通过构建相应的 ComponentName来初始化媒体浏览器服务的客户端也即是 MediaBrowser 来连接媒体浏览器服务的服务端 MediaBrowserService,连接成功后应用获取到 MediaController 来控制音乐。

     因为ComponentName指明了bind哪个服务,从而可以正确找到蓝牙服务中对应于媒体浏览器的服务。根据蓝牙服务的清单文件AndroidManifest.xml指定,应用构建相应的ComponentName,构建此变量需要提供包名package和类名class。

3.2、代码分析:

1、按照以上实现原理,首先我们需要连接媒体浏览器服务:

(1)、android-7(N版本) ~ android-9(P版本):

       String package = "com.android.bluetooth"

       String class = "com.android.bluetooth.a2dpsink.mbs.A2dpMediaBrowserService" 

 (2)、Android10以上的版本服务包名和文件名分别为:

       String package = "com.android.bluetooth"

       String class = "com.android.bluetooth.avrcpcontroller.BluetoothMediaBrowserService"

 private void connectMediaBrowser() {
        //1.绑定服务,Android10以上的版本服务名称为
        ComponentName componentName = new ComponentName("com.android.bluetooth", "com.android.bluetooth.avrcpcontroller.BluetoothMediaBrowserService");
        // 2.创建MediaBrowser
        mMediaBrowser = new MediaBrowser(this, componentName, connectionCallback, null);
        //3.连接MediaBrowser
        mMediaBrowser.connect();
    }
2、connectionCallback接口回调监听与流媒体服务是否连接成功,若连接成功则获取MediaController对象,通过MediaController 来控制音乐
private MediaBrowser.ConnectionCallback connectionCallback = new MediaBrowser.ConnectionCallback() {
        public void onConnected() {
            //如果服务端接受连接,就会调此方法表示连接成功,否则回调onConnectionFailed();
            Log.d(TAG, "onConnected: ");
            //获取配对令牌
            MediaSession.Token token = mMediaBrowser.getSessionToken();
            //通过token,获取MediaController,第一个参数是context,第二个参数为token
            mMediaController = new MediaController(mContext, token);
            Log.e(TAG, "mMediaController===" + mMediaController);
            //mediaController注册回调,callback就是媒体信息改变后,服务给客户端的回调
            mMediaController.registerCallback(mMediaCallBack);
        }

        public void onConnectionSuspended() {
            Log.d(TAG, "onConnectionSuspended: ");
            //与服务断开回调(可选)
            
        }

        public void onConnectionFailed() {
            Log.d(TAG, "onConnectionFailed: ");
            //连接失败回调(可选)
           
        }
    };
3、MediaController.Callback接口监听音乐信息和播放状态的变化,得到MediaMetadata 对象后通过MediaDescription 即可获取音乐名称,歌手,专辑名。PlaybackState获取播放状态,进度。

 详细接口解释可参考Android官方文档:MediaDescription  |  Android Developers (google.cn)

 

 private MediaController.Callback mMediaCallBack = new MediaController.Callback() {
        @Override
        public void onMetadataChanged(@Nullable MediaMetadata metadata) {
            super.onMetadataChanged(metadata);
            if (metadata != null) {
                MediaDescription description = metadata.getDescription();
                String title=description.getTitle().toString();//音乐名称
                String singer=description.getSubtitle().toString();//歌手
                String album=description.getDescription().toString();//专辑名称
              
            }
        }

        @Override
        public void onPlaybackStateChanged(@Nullable PlaybackState state) {
            super.onPlaybackStateChanged(state);
            //播放状态信息回调
          
            long position = state.getPosition();//获取当前播放进度
            
            int playState=state.getState(); //当前播放状态      
        }
    };
4、蓝牙音乐通过 MediaController.getTransportControls()提供的音乐控制接口下发相应的指令,指令经过媒体浏览器服务转送到蓝牙服务中,通过蓝牙技术传输到远端设备执行响应的动作,最终达到控制蓝牙音乐的目的。
mMediaController.getTransportControls().skipToPrevious();//上一曲
mMediaController.getTransportControls().skipToNext();//下一曲
mMediaController.getTransportControls().play()//播放
mMediaController.getTransportControls().pause();//暂停
5、注意我们需要在AndroidManifest文件中申请权限,如果是Android 10以上设备还需要动态申请权限
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

详细有关蓝牙协议的源码分析可参考文章:

Android 控制车载蓝牙播放音乐详解流程_Android_脚本之家 (jb51.net)

创造不易,转载请标明出处!!!

标签:MediaController,音乐,蓝牙,mMediaController,一曲,播放,连接
From: https://blog.csdn.net/CHenhong_666/article/details/141460528

相关文章

  • JSP基于SSM的校园音乐平台vnzr8(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统功能:用户,校园歌手,明星歌手,歌曲类别,校园歌曲,歌曲mv,歌手歌曲开题报告内容一、课题背景与意义随着互联网技术的快速发展,网络音乐平台已成为人们日常生......
  • 解锁私人音乐宇宙:SPlayer智能推荐,每日新发现,乐趣无限升级!
    前言在快节奏的工作生活中,你是否经常为了寻找一首好听的歌曲而烦恼?如果有一款音乐播放器,它不仅能让你轻松找到喜欢的歌曲,而且还是开源免费使用;这听起来是不是很吸引人呢?而SPlayer正是这样的一款音乐播放器!无论是在家休闲娱乐,还是在办公室专注工作,都能提供最贴心的音乐享......
  • uniapp [全端兼容] - 最新详细实现拍摄视频录像并可播放预览视频,调起本机摄像头开启录
    前言网上的教程乱七八糟BUG太多,本文提供优质示例代码。在uni-app全平台兼容(H5网页网站、支付宝/微信小程序、安卓App、苹果App、nvue)项目开发中,详解完成“uniApp拍摄录制视频并预览播放”,调起本机系统摄像头打开视频录制,用户点击按钮开始拍摄视频最终完成摄影,然后保......
  • Net6实现ZLMediakit播放鉴权
    usingMicrosoft.AspNetCore.Mvc;usingNewtonsoft.Json;usingSystem;usingSystem.Collections.Generic;usingZLMediaKitHook.Utility;usingZLMediaKitHook.Utilty;usingZLMediaKitHook.Utilty.dto;usingZLMediaKitHook.Utilty.dto.rtsp_auth;namespaceZLMedi......
  • 基于nodejs+vue协同过滤算法的音乐推荐系统 [程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,数字音乐已成为人们日常生活中不可或缺的一部分。面对海量的音乐资源,用户往往难以快速找到符合个人喜好的音乐作品。传统的音乐搜......
  • 轻松创作高质量的AI音乐——Suno API
    Suno歌曲生成API对接说明随着AI的应用变广,各类AI程序已逐渐普及。AI已逐渐深入到人们的工作生活方方面面。而AI涉及的行业也越来越多,从最初的写作,到医疗教育,再到现在的音乐。Suno是一个专业高质量的AI歌曲和音乐创作平台,用户只需输入简单的文本提示词,即可根......
  • mcxdriv.dll丢失全解析:多媒体播放修复的专家级策略
    mcxdriv.dll是一个与MicrosoftMediaCenter或某些多媒体应用程序相关的动态链接库(DLL)文件。这个DLL文件包含了处理多媒体播放、视频解码等功能所需的函数和资源,对于确保多媒体应用程序在Windows操作系统中的正常运行非常重要。当mcxdriv.dll文件丢失时,可能会导致以下问题:M......
  • 网易云音乐故障 2 小时,这次到底谁背锅?(今天记得领补偿)
    大家好,我是程序员鱼皮,8月19日下午,网易云音乐突发严重故障,并登顶微博热搜,跟黑神话悟空抢了热度。根据用户的反馈,故障的具体表现为:用户无法登录、歌单加载失败、播放信息获取失败、无法搜索歌曲等等,几乎是无法使用了,妥妥的P0级事故!根据官方发布的说明,本次故障的主要原因是......
  • 计算机毕业设计django+vue音乐网站的设计与实现【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网的飞速发展,音乐已成为人们日常生活中不可或缺的一部分,数字音乐平台的兴起更是极大地丰富了人们的音乐获取方式。传统的音乐播放......
  • 基于java+ssm+jsp+vue的中国风音乐网站vue(源码+数据库+lw+PPT+讲解视频)
    前言......