java - 如何以编程方式在 Android 上的蓝牙音频设备之间切换音频

标签 java android kotlin bluetooth

让我困惑了好久。

我在 Android 手机上连接了两个 bt 音频设备,并且我想以编程方式切换特定的 bt 音频设备。

我搜索有关 a2dp、媒体路由器和audioManager 的关键字,但似乎无法执行此操作...

我找到该功能的唯一方法是:

BT 设备=> A 和 B 在 Android 手机上连接。 现在媒体播放到 A,我想切换到 B

第 1 步:A、B 在 Android 手机上取消配对。

第 2 步:在 Android 手机上配对。

第三步:在 Android 手机上进行 B 配对。

媒体播放输出为B,

似乎最新配对的蓝牙设备是媒体播放输出。

有人可以给我一些建议或指导吗? 谢谢大家

最佳答案

Documentation说它一次只能连接到一个 A2DP 设备,因此您应该能够通过连接到您想要使用的设备来在设备之间切换。 您可以使用 BluetoothSockets 连接到设备.

编辑: 我找到了其他解决方案,其中一个我认为可靠。它们都依赖于方法反射。

第一个来自这个 post .

  1. 从serviceListener获取BluetoothA2dp代理
  bluetoothManager.adapter.getProfileProxy(this, serviceListener, BluetoothProfile.A2DP)

  private val serviceListener = object : BluetoothProfile.ServiceListener {
      override fun onServiceDisconnected(profile: Int) {
          if (profile == BluetoothProfile.A2DP) {
              bluetoothA2dp = null
          }
      }

      override fun onServiceConnected(profile: Int, proxy: BluetoothProfile?) {
          if (profile == BluetoothProfile.A2DP) {
              handler.post(btSearchRunnable)
              bluetoothA2dp = proxy as BluetoothA2dp
          }
      }
  }
  • 从反射中获取“connect”方法。
  • private val connect = BluetoothA2dp::class.java.getDeclaredMethod("connect",BluetoothDevice::class.java)
    
  • 使用代理作为第一个参数、设备作为第二个参数来调用方法。
  • connect.invoke(bluetoothA2dp,device)
    

    另一种方法使用反射来获取 createRfcommSocket 来规避您通常无法访问的一个参数的问题。我可以发布一个链接,但我遇到的一个问题是主线程总是滞后,总是给我一个错误并且连接不可预测。

    关于java - 如何以编程方式在 Android 上的蓝牙音频设备之间切换音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56458582/

    相关文章:

    java - 编写一个更简洁、更模块化的命令解析器

    java - 如何在osmdroid中扩展ResourceProxy接口(interface)?

    android - ActionMode.Callback 的实现

    java - GWT Designer 组件

    java - 在 Java 中创建 XML 文件的最佳方法是什么?

    android - 用对话框覆盖后退按钮

    android - ListView 从 EditText 更新

    kotlin - sortedBy() 选择器不排序列表

    kotlin - 在没有 getValue 和 setValue 的情况下,Kotlin 的 `lazy` 实现如何工作?

    java - 转换为 Graphics2D