抱歉提问。这是我第一次来这里。我在网上做了一些搜索,但没有结果。真的需要帮助来澄清这个问题。 我有两个关于USB耳机检测和状态查询的问题。
我的目标设备运行的是 Android 版本 7.1.1。该设备具有 USB type-c 连接器并支持 USB type-c 耳机。但是,当 USB 耳机状态更改时,AudioService 似乎不会发送 Intent 。 OEM 是否必须针对这种情况实现自己的 Intent ?
对于传统的有线耳机,我可以使用 AudioManager.isWiredHeadsetOn() 来检查它的状态。但是USB type-c耳机好像不能这样用。有没有其他方法可以获取USB耳机的状态?
谢谢, 磊
最佳答案
除了 EscapeArtist 建议的方法,您还可以监听 UsbManager.ACTION_USB_DEVICE_ATTACHED
和 UsbManager.ACTION_USB_DEVICE_DETACHED
操作并检查当前连接的 USB 设备是否具有音频接口(interface) UsbConstants.USB_CLASS_AUDIO
。不幸的是,AudioManager.ACTION_HEADSET_PLUG
不会针对复合(不要担心措辞)USB 设备触发,例如 OTG + 标准 USB 耳机,或者只是 USB-C 耳机。
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == UsbManager.ACTION_USB_DEVICE_ATTACHED) {
context.usbManager.deviceList.values.indexOfFirst {
it.hasUsbAudioInterfaceClass()
}.takeIf { it > -1 }?.run {
//This attached USB device has audio interface
}
} else if (intent.action == UsbManager.ACTION_USB_DEVICE_DETACHED) {
val device: UsbDevice? = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE)
device?.apply {
if (hasUsbAudioInterfaceClass()) {
//This detached USB device has audio interface
}
}
}
}
UsbDevice
搜索带有音频专用音频接口(interface)的 USB 设备的扩展函数。
fun UsbDevice.hasUsbAudioInterfaceClass(): Boolean {
for (i in 0 until interfaceCount) {
if (getInterface(i).interfaceClass == UsbConstants.USB_CLASS_AUDIO) {
return true
}
}
return false
}
监听分离设备不是强制性的,因为您可以依赖 ACTION_AUDIO_BECOMING_NOISY
。
关于android - Android中的USB type-c耳机检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41583448/