我想在用户连接/断开麦克风(有线、蓝牙)时收到通知。我实现了 this 并使用 2 个模拟器进行了测试。模拟器 e26 使用 API 26,模拟器 e31 使用 API 31。
我的代码非常简单,我将上面的文档中的代码复制粘贴到片段的顶部和 onStart 中:
// declaration at top of the class:
val audioDeviceCallback: AudioDeviceCallback = object : AudioDeviceCallback() {
override fun onAudioDevicesAdded(addedDevices: Array<AudioDeviceInfo>) {
// some timbers
}
override fun onAudioDevicesRemoved(removedDevices: Array<AudioDeviceInfo>) {
// some timbers
}
}
// in onStart:
audioManager.registerAudioDeviceCallback(audioDeviceCallback)
问题: 模拟器 e31 不会收到这些回调。 onAudioDevicesAdded 在片段开始时触发一次,但它不会响应我打开和关闭模拟麦克风(模拟器 > 溢出 > 麦克风 > 并勾选所有 3 个开关)。
但是,模拟器 e26 的工作方式与宣传的一样:当我勾选开关时,它会得到一个“添加”,当我取消勾选它们时,它会得到一个“删除”。
其他研究: 打印模拟器可见的设备类型,e26 看到类型 15(内置麦克风)和 3(有线麦克风),非常好。 (实际上,它看到两个类型 3 设备:一个是接收器,另一个是源。删除时,它一次删除一个;添加时,它一次性添加它们。)
e31 看不到类型 3。相反,它看到 类型 25“远程子混音”。显然,当我摆弄模拟器麦克风时,该设备类型不会触发监听器。 (e31 报告了另外两个设备,它们似乎与本讨论无关:16 和 18。e26 没有列出这些设备,25 也没有列出。)
是模拟器吗? 不。我在真实设备、部署的应用程序(不是通过 SDK)上得到了相同的行为:当我插入/拔出有线耳机时,侦听器不会收到回调。
我注意到 28 版本中的音频/媒体内容发生了一些安静的变化,但没有什么特别引起我注意的 AudioDeviceCallback。
我不喜欢这种方法——我想要的只是在用户插入/拔出外部麦克风时收到通知,这是我找到的唯一文档。救命!!
非常感谢