当前位置: 首页 > 知识库问答 >
问题:

如何检测断开连接的蓝牙音频设备是当前播放音乐流的设备?

郭和硕
2023-03-14

我的audio player应用程序当前正在侦听“ACTION\u ACL\u DISCONNECTED”事件,检查BluetoothDevice的意图。EXTRA_DEVICE,并检查该设备的类以查看它是否是BluetoothClass。装置专业AUDIO\u VIDEO设备。如果是这样,那么我想暂停播放。基本上,当蓝牙耳机或汽车连接断开时暂停。

然而,我发现这对一些实际上以其他方式收听的用户来说很有吸引力。例如,配对蓝牙扬声器并听一会儿。然后插入有线耳机;播放不会错过任何节拍,蓝牙扬声器不再接收音频,但它仍然连接着。如果我失去蓝牙连接(关闭扬声器或走出范围),我的播放会暂停,但我不希望这样,因为STREAM_MUSIC音频实际上是转到有线耳机的。

当我收到断开连接的动作ACL时,我如何判断该设备是否是当前接收音乐流的设备?BluetoothDevice类上有什么东西吗?我可以查询AudioManager或其他一些系统服务来了解哪个设备正在接收音频流,并将其与我刚刚接收到断开广播的设备进行比较吗?有什么想法吗?

更新:

我看到AudioManager提供了isBluetoothA2dpOn()isBluetoothScoOn()isSpeakerphoneOn()isWiredHeadsetOn()

这适用于我的例子。如果用户从蓝牙扬声器切换到有线耳机,isBluetoothA2dpOn返回False,因此我可以忽略断开事件。但是如果用户从一个蓝牙连接更改为另一个蓝牙连接怎么办?isBluetoothA2dpOn将返回True,但ACTION_ACL_DISCONNECTED可能适用于未接收音频的设备?

共有1个答案

公孙弘图
2023-03-14

您也可以注册广播接收器并播放/暂停音乐。这是我在车上使用的音乐应用程序的kotlin实现

class BluetoothConnectionStateReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
            val intentAction = intent.action ?: return
            // only interested in BT connection state regardless of other STATE_CHANGED
            BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED -> {
                when (intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE, -1)) {
                    BluetoothAdapter.STATE_DISCONNECTED -> {
                        logMessage("STATE_DISCONNECTED")
                        // pause music
                    }
                    BluetoothAdapter.STATE_CONNECTED -> {
                        logMessage("STATE_CONNECTED")
                        // auto play music
                    }
                }
            }
        }
    }
}

然后在你的清单上声明你的接收者

<receiver
    android:name=".music.player.BluetoothConnectionStateReceiver"
    android:enabled="true">
    <intent-filter>
        <action android:name="android.bluetooth.adapter.action.CONNECTION_STATE_CHANGED" />
    </intent-filter>
</receiver>
 类似资料:
  • 我对同一主题进行了研究,发现android设备是a2dp源,音频只能从a2dp源流式传输到a2dp接收器。A2dp接收器可以是蓝牙耳机或蓝牙扬声器。 但我的问题是,Android应用程序“蓝牙音乐播放器”是如何工作的? 它允许从一部手机到另一部手机进行流媒体传输。因此,在这种情况下,收听移动设备必须充当接收器。这怎么可能?他们是否使用其他配置文件而不是a2dp? 好吧,这可能是他们使用的不同配置文

  • 我可以在Android中看到蓝牙设备的两种状态。1、配对2。已连接-<我正在尝试在Android系统中使用当前连接的蓝牙设备。但我只从适配器获得配对设备列表。getBondedDevices() 我需要当前连接的设备。我怎么能得到这个。请有人帮我实现这一点。提前谢谢。

  • 连接设备 接口说明 用于连接 扫描出来的蓝牙设备。 参数说明 字段 类型 必须? 说明 device RKBLEDevice 是 蓝牙设备 示例代码 Swift: RokidMobileSDK.binder.connect(device: RKBLEDevice) Objc: [RokidMobileSDK.binder connect:device]; 断开设备 接口说明 用于断开已经连接的

  • 连接蓝牙设备 接口说明 接口需传入蓝牙名称(蓝牙address重启后会变) 参数说明 字段 类型 必须? 说明 name String 是 设备名称 举个大栗子 RokidMobileSDK.binder.connectBT(name, new IBTConnectCallBack() { @Override public void onConnectSucceed(BTDevic

  • 我目前正在做一个音乐应用程序,因为我需要在蓝牙耳机中播放缓冲音频歌曲。我搜索了过去1天的代码。但我不能。请给出解决方案如何在我的音乐应用程序中添加它。 还有一件事,我需要在iphone处于背景模式和屏幕锁定模式时播放蓝牙耳机中的音频。 我已在我的音乐应用程序中添加了此代码,但此代码适用于捆绑音频文件。但我需要缓冲音频。如果不可能,请告诉我的代码是否正确,通过蓝牙耳机播放本地音频文件。?

  • 我想让我的android应用程序检测蓝牙耳机(通过名称或mac地址)是否已连接,然后根据它是否已连接运行代码。问题是我在如何获取当前连接的蓝牙耳机的名称/mac地址方面一直碰壁。 下面的代码只是给出了Android设备的主机名: 当我使用“getBondedDevices()”时,它通常只给我手机配对的设备,而不是现在连接的设备。换句话说,它提供了之前配对设备的列表,但没有提供实际连接的设备。 我