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

标签 android bluetooth

我的音频播放器应用目前正在监听 ACTION_ACL_DISCONNECTED 事件,检查 BluetoothDevice.EXTRA_DEVICE 的 Intent ,并检查设备的类别以查看它是否是 BluetoothClass.Device.Major.AUDIO_VIDEO 设备。如果是这样,那么我想暂停播放。基本上,当蓝牙耳机或汽车连接断开时暂停。

但是,我发现这会触发某些实际上以其他方式收听的用户。例如,与蓝牙扬声器配对并聆听一会儿。然后插上有线耳机;播放不会错过任何一个节拍,蓝牙扬声器不再接收音频但仍处于连接状态。如果我失去了蓝牙连接(关闭扬声器或走出范围),我的播放会暂停,但我不希望它暂停,因为 STREAM_MUSIC 音频实际上正在进入有线耳机。

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

更新:

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

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

最佳答案

您也可以改为注册一个广播接收器并播放/暂停音乐。这是我在汽车中使用的音乐应用程序的 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
                    }
                }
            }
        }
    }
}

然后在你的 list 中声明你的接收者

<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 - 如何检测断开连接的蓝牙音频设备是当前播放音乐流的设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29609557/

相关文章:

java - 在类之间传递字符串时,Android 应用程序崩溃

ios - 在 iPad App 中检测蓝牙键盘

android - 蓝牙连接被安全 rfcomm 套接字拒绝(适用于不安全)

android - 加载下一页成功后 GridView 总是滚动到顶部

android - Kotlin 中用于参数的通用通配符

android - Gridview 图像在滚动时更改/随机播放

c# - 使用蓝牙将 ASCII 从 C# 发送到 Arduino

java - BlueCove、笔记本电脑和带蓝牙的 Android 平板电脑

node.js - 约翰尼五世蓝牙连接问题

java - 出错后重启 BehaviorSubject