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

时间:2015-04-13 15:44:24

标签: android bluetooth

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

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

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

更新:

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

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

1 个答案:

答案 0 :(得分:0)

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