Android蓝牙开发系列文章-其实你的手机可以变成一个蓝牙音箱

article/2025/9/14 16:08:21

本文是蓝牙音频相关的第3篇文章,查阅其他内容,请点击《Android蓝牙开发系列文章-策划篇》。

目前a2dp相关的内容有:

《Android蓝牙开发系列文章-AudioTrack播放PCM音频》

《Android蓝牙开发系列文章-蓝牙音箱连接》

我们通常直接手机听歌或者接个蓝牙音箱来听歌,其实你的手机也可以变成一个蓝牙音箱来使用。

怎么来做这个转变呢?让我一起学起来吧~

本文主要内容包括:1.什么是a2dp sink? 2.如何实现a2dp和a2dp sink状态的切换?

目录

1.什么是a2dp sink?

2.如何实现a2dp和a2dp sink状态的切换?

2.1将设备暂停a2dp

2.2启动a2dp sink


1.什么是a2dp sink?

两个蓝牙设备连接之后,一个设备提供音频数据,另外一个设备出声音,我们将提供数据的一端称为a2dp source(源端),发出声音的一端称为a2dp sink(目的端)。

也就是说,a2dp与a2dp sink是两个相对的状态,一个蓝牙设备一个时刻只能处于其中的一种状态。

现在一些智能设备可以实现a2dp与a2dp sink状态之间的切换(但一个时刻只能是其中一个状态)。

与a2dp/a2dp sink协议紧密关联的一个协议之avrcp(Audio/Video Remote Control Profile)协议,该协议实现了从sink端到souce端的反向控制,例如,暂停、停止、启动重放、音量控制及其它类型的远程控制操作。

2.如何实现a2dp和a2dp sink状态的切换?

在实际动手完成两个状态切换前,需要明确你的设备是否支持这两种状态。对于耳机、音箱这类设备而言,即使将它砸了,它也很难切到a2dp source状态,因为它一出生就决定了自己没有这个状态的使用场景,不信你可以砸了试一下,O(∩_∩)O哈哈~

而对于通常作为音乐播放端的某些手机和智能电视是可能切到sink状态的。 

怎么来判断自己的手机或者电视是否支持a2dp sink呢?大体可以按照如下步骤确定,但是不是说这个步骤都满足了,你的设备肯定是支持a2dp sink的,因为我们看不到设备的源码,甚至我们连root权限都没有。

  1. 确认设备是否自带sink功能的使用场景(一般来说,如果没有自带使用场景,sink功能应该要默认关闭,不然就是给自己的产品挖了一个坑)
  2. 串口执行:dumpsys package com.android.bluetooth,看一下是否支持A2dpSinkService
  3. 去跟蓝牙芯片方案商确认是否支持sink功能
  4. 参考本文的代码,写一个demo来试一下

下面来讲一下我们的demo实现:

2.1将设备暂停a2dp

在停掉a2dp前,我们需要将处于连接状态的设备进行断开。

为了让我们的设备可以被其他设备扫描到和可被连接,我们需要将设备的蓝牙扫描模式设置成可被发现、可被连接。

如上提到的两点也是很重要的,我的demo里面没有实现它,是通过在设置中进行操作来替代了代码实现。

停掉a2d的动作对于应用层来说就是停掉a2dp service,这个动作会触发一些系列的a2dp状态清理动作,这个动作是从上而下的一整套,不仅仅是设计Host端,也涉及Controller。

    public void stopSource() {Intent intent = new Intent();intent.setAction("com.android.bluetooth/.a2dp.A2dpService");intent.setPackage("com.android.bluetooth");intent.putExtra("action", "com.android.bluetooth.btservice.action.STATE_CHANGED");intent.putExtra(BluetoothAdapter.EXTRA_STATE, 10);startService(intent);}

你也许会问:你怎么知道这样写就可以启动A2dpService的?

如果,你研究过蓝牙开关流程的话,你应该看到过各种profile的启动流程,也就是说以上这段代码就是从源码中摘出来的,

Android源码如下:

@SuppressWarnings("rawtypes")private void setGattProfileServiceState(Class[] services, int state) {if (state != BluetoothAdapter.STATE_ON && state != BluetoothAdapter.STATE_OFF) {Log.w(TAG,"setGattProfileServiceState(): invalid state...Leaving...");return;}int expectedCurrentState= BluetoothAdapter.STATE_OFF;int pendingState = BluetoothAdapter.STATE_TURNING_ON;if (state == BluetoothAdapter.STATE_OFF) {expectedCurrentState= BluetoothAdapter.STATE_ON;pendingState = BluetoothAdapter.STATE_TURNING_OFF;}for (int i=0; i <services.length;i++) {String serviceName = services[i].getName();String simpleName = services[i].getSimpleName();if (simpleName.equals("GattService")) {Integer serviceState = mProfileServicesState.get(serviceName);if(serviceState != null && serviceState != expectedCurrentState) {debugLog("setProfileServiceState() - Unable to "+ (state == BluetoothAdapter.STATE_OFF ? "start" : "stop" )+ " service " + serviceName+ ". Invalid state: " + serviceState);continue;}debugLog("setProfileServiceState() - "+ (state == BluetoothAdapter.STATE_OFF ? "Stopping" : "Starting")+ " service " + serviceName);mProfileServicesState.put(serviceName,pendingState);Intent intent = new Intent(this,services[i]);intent.putExtra(EXTRA_ACTION,ACTION_SERVICE_STATE_CHANGED);intent.putExtra(BluetoothAdapter.EXTRA_STATE,state);startService(intent);return;}

2.2启动a2dp sink

直接上代码:

public void startSink() {Intent intent = new Intent();intent.setAction("com.android.bluetooth/.a2dp.A2dpSinkService");intent.setPackage("com.android.bluetooth");intent.putExtra("action", "com.android.bluetooth.btservice.action.STATE_CHANGED");intent.putExtra(BluetoothAdapter.EXTRA_STATE, 12);startService(intent);}

这么写的原因在上面已经说了哈~ 

这里要说一下,在不同的Android版本中,a2dp sink的路径有所改变,也就是intent action的写法会有所区别。可以针对具体设备就行分析,一个方法:dumpsys package com.android.bluetooth看一下,例如,我的设备显示长这个样子:

好了,本篇内容到这里就结束了~

欢迎留言讨论问题哈

如果想持续关注本博客内容,请扫描关注个人微信公众号,或者微信搜索:万物互联技术。


http://chatgpt.dhexx.cn/article/3oSn4ngB.shtml

相关文章

如何将任意品牌型号的蓝牙音响组合成环绕立体声

任意品牌型号的蓝牙音响如何实现立体声输出&#xff0c;其实很简单&#xff0c;只需要通过以下三个步骤即可实现。 1. 手头上有多个音响设备 由于对便携式蓝牙音响的喜爱&#xff0c;经常会在看到一些音质还不错的品牌音响的时候忍不住的要买来试试&#xff0c;最近几年买了B…

手把手教你如何将有线音箱改装成蓝牙音箱

手把手教你如何将有线音箱改装成蓝牙音箱 MH-M28简介图片参考接线说明手机连接使用总结 原文链接&#xff1a;https://www.yourcee.com/newsinfo/2923958.html MH-M28简介 本期介绍的MH-M28模块在同系列的模块中只有M28带有3.5mm的耳机接口非常方便使用&#xff0c;也是我们本…

[毕设]基于STM32的语音识别智能蓝牙音箱设计

基于STM32语音识别智能蓝牙音箱设计 目录标题 基于STM32语音识别智能蓝牙音箱设计设计说明&#xff1a;原理图PCB图源程序设计说明书1 . 1 **研究背景及意义**1 . 2 **国内外研究现状**器件清单资料清单 &#xff08;源程序原理图PCB设计说明书PPT&#xff09; 原理图&#xf…

一款经济型蓝牙小音箱维修与拆解--音箱品牌Niye

蓝牙小音箱&#xff0c;音箱品牌Niye&#xff0c;型号&#xff1a;HY-22。 儿子的故事机&#xff08;可以插入TF卡的蓝牙小音箱&#xff09;每天跨到身上&#xff0c;从早到晚听故事&#xff0c;而且常常一个故事重复听&#xff01;昨晚终于安静了&#xff0c;世界真美好&…

Win10下蓝牙音箱无法调节音量的解决方案

转自:Windows下蓝牙音箱无法调节音量的解决方案https://www.simaek.com/archives/17/ 参考原主答案&#xff0c;在自己电脑上实验成功&#xff0c;解决了问题。问题貌似产生在某次显卡驱动更新时动了音频驱动配置。原文如下&#xff1a; Windows1803版本后默认启用了蓝牙绝对音…

蓝牙音箱方案选用及设计注意

蓝牙音箱这个产品这两年一直量比较大&#xff0c;从高端的JBL,BOSE,飞利浦&#xff0c;到国内牌子DOSS&#xff0c;艾特铭客&#xff0c;不见不散&#xff0c;乐果&#xff0c;魅动以及一大批新品牌和山寨产品&#xff0c;本来音箱行业是个传统的行业&#xff0c;加入了蓝牙后培…

智能蓝牙音箱方案的四大问题

智能蓝牙音箱是音箱升级的产物&#xff0c;是家庭消费者用语音控制的一个智能化设备。譬如&#xff1a;人们可以通过智能音箱点歌曲、上网购物或是了解天气预报等。同时&#xff0c;它也可以对智能家居设备进行控制&#xff0c;比如打开窗帘、设置冰箱温度、提前让热水器升温等…

都2019了,这些曾经的经典游戏还能在mac玩到吗?(第一弹仙剑客栈mac版)

马上就要过年了,时间也早就走到2019了,Mac电脑的配置现在是越来越高,Mac游戏的画质也是越来越棒,对于80和90后来说,很多纯粹的游戏体验,也许还是那些DOS时代的经典游戏。很多使用mac电脑朋友想问在mac平台上有没有这些游戏的复刻版?可惜的是由于各式各样的原因,我们暂时…

Mac 必备软件推荐

本人程序猿一枚&#xff0c;Mac重度用户&#xff0c;非常依赖于Mac做开发&#xff0c;前段时间换电脑&#xff0c;需要在新电脑上装一些软件&#xff0c;在安装的过程中&#xff0c;需要找各种软件&#xff0c;今天做一下总结&#xff0c;方便以后更换电脑的时候&#xff0c;直…

强烈推荐 10 款免费的 Mac 软件!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 01、IINA IINA 是一款播放器软件&#xff0c;可以打开几乎所有格式的视频&#xff0c;如果 IINA 都打不开&#xff0c;那么其他软件注定也打不开。 IINA 还提供了 Chrome 插件&#xff0c;…

MAC OS 应用推荐

MAC OS 应用推荐 有很多好的工具&#xff0c;但是收费很贵&#xff0c;真的用不起&#xff1b; 用盗版不太建议&#xff0c;其他还有一些替代方案。 一. 数据库客户端工具 1. DBeaver社区版&#xff08;免费&#xff09; 支持多系统&#xff0c;mac、windows。通过添加不通…

推荐这11款免费好用的 Mac 软件

目录 1、IINA —— 全能视频播放器 02、大拍档剪辑助手 03、Dozer 04、Cheatsheet 05、Spectacle 06、Amphetamine 07、Macs Fan Control 08、AdGuard 09、Keka 10、腾讯柠檬清理 11、Cold Turkey Blocker 1、IINA —— 全能视频播放器 对于Mac OS来说&#xff0c;IINA可以说是…

强烈推荐 10 款 Mac 软件!

作为一个工具控&#xff0c;一直在社区索取别人的营养&#xff0c;今天在下将我搜集的一些应用贡献出来&#xff0c;推介二十几个我常用的软件。一些是其他人反复推介确实经典&#xff0c;另一些是我偶然发现但经过使用感觉非常好用&#xff0c;一并献上&#xff0c;大家可以根…

Mac必备软件13款,强烈推荐

一、Permute 它用于格式转换&#xff0c;包括视频、音频&#xff0c;图片乃至pdf&#xff0c;不仅效率高&#xff0c;而且完美配合downie、iTunes&#xff0c;浑然一体&#xff0c;极其舒适 二、Downie 既然提到Permute就不得不提Downie&#xff0c;它支持1000网站视频下载&a…

强烈推荐 10 款免费的 Mac 软件

2017 年的时候&#xff0c;我花了将近 2 万块买了一台 27 寸的 iMac&#xff0c;但刚入手的时候&#xff0c;觉得真特么不习惯啊&#xff0c;好多 Windows 上好用的软件 APP Store 上都没有&#xff01; 我老婆三番五次调侃我浪费钱&#xff0c;还不如买台联想台式机&#xff0…

mac软件推荐

1、软件安装网站 https://www.macwk.com/ &#xff08;首推&#xff09; https://macoshome.com/app 2、必备工具软件 画图工具 patina draw.io 绘制流程图&#xff0c;uml图等 数据库设计软件 控制工具 scroll reverse &#xff08;鼠标与触摸板控制工具&#xff09; …

Mac?Windows?游戏本?大学生到底该如何选择适合自己的笔记本

文章目录 前言一、分析自己的定位和需求性能强劲&#xff1f;游戏本方便实用&#xff1f;轻薄本iPad怎么样&#xff1f;所以我该选哪一个 二、游戏本如何选&#xff1f;参数和配置选Intel还是AMD? 三、轻薄本Windows还是Mac&#xff1f;为什么选Mac选M1还是Intel芯片&#xff…

在 Mac 上玩网游的简单方式

很多网游游戏都能够在Windows 上进行安装使用&#xff0c;但是在 Mac 上却不怎么友好&#xff0c;所以很多网游都不能在 Mac 上玩。那么怎么才能在 Mac 上使用 Windows 版本的游戏呢&#xff1f; 图1&#xff1a;Mac 玩游戏 有的人会选择在 Mac 上安装个虚拟机&#xff0c;然…

Mac 可以玩游戏吗,有哪些游戏可以玩?

Mac 可以玩游戏吗&#xff0c;有哪些游戏可以玩&#xff1f; 新款的 MacBook Pro 入手有一段时间了&#xff0c;期间一直在熟悉 MacOS 系统及日常工作使用&#xff0c;一直都听说 MacBook 是工作本&#xff0c;不得不说工作使用确实很强&#xff0c;但用的久了就还是特别想折腾…

适合MacBook Pro 2021玩的游戏推荐

搭载着M1 Pro和M1 Max芯片的全新设计的“复古经年款”Macbook Pro已经上市了&#xff0c;我们震惊于其卓越的工作性能以及颜值之外&#xff0c;就想问一句能打游戏了吗&#xff1f;多数人都会告诉你Mac不适合玩游戏&#xff0c;但实际真的是这样吗? 其实Mac 电脑同样是可以玩…