我有一个功能,我需要获取系统活动音频输出设备的当前和检测开关。就像是:
在我看来,这应该有一个 API,但似乎有几个。最有意义的一个似乎是,MediaRouter但它有两个大问题阻止我如上所述使用它:
Complete Local Name可用于此目的,可从BluetoothDevice类型获得,但不能从MediaRouter. 相反,MediaRouter使一个productName可用,有时可以是蓝牙设备的别名,而不是静态名称。我已经放弃了这个 API 并继续寻找其他解决方案,如果有人认为有办法解决上述问题,请告诉我,最重要的是第一个。我会注意到我同时使用了android.media.MediaRouter和androidxone,它们都有这些问题。
我现在正在利用其他 API 的组合。它有效,但它远非可接受的解决方案:
使用AudioManager.registerAudioDeviceCallback(object : AudioDeviceCallback)非蓝牙设备检测(AudioDeviceInfo.TYPE_WIRED_HEADPHONES, AudioDeviceInfo.TYPE_BUILTIN_SPEAKER))。当添加或删除这些设备中的任何一个时,我会收到回调,然后我可以检查是否存在有线类型设备,那么它在 100% 的时间都是活动的,如果不是,则嵌入式类型是活动的。这有点hacky,但它有效。
更有趣的是,为了检测蓝牙输出设备,我使用了一个私有 API,Android 本身在设置应用程序中使用它来显示当前的音频输出设备。
BluetoothA2dp::class.java.getDeclaredMethod("getActiveDevice") 获取当前活动的输出设备。这是通过获取配置文件代理服务来完成的bluetoothAdapter.getProfileProxyBluetoothA2dp::class.java.getField("ACTION_ACTIVE_DEVICE_CHANGED").get(null)以检测蓝牙有源音频设备的开关。此解决方案有效,但也有一些限制:
android a2dp android-audiomanager android-bluetooth mediarouter