安卓系统中USB Type-C耳机的检测

4

抱歉提问,这是我第一次来这里。我在网上搜索了一些内容,但没有结果。真的需要帮助澄清这个问题。

  1. 我的目标设备运行Android 7.1.1版本。该设备具有USB Type-C连接器,并支持USB Type-C耳机。然而,当USB耳机状态改变时,似乎AudioService不会发送意图。OEM必须为此情况实现自己的意图吗?

  2. 对于传统的有线耳机,我可以使用AudioManager.isWiredHeadsetOn()来检查它的状态。但是USB Type-C耳机似乎无法以这种方式工作。有没有其他方法来获取USB耳机的状态?

谢谢, 雷


同样的问题在这里。我注意到在拔掉Type-C耳机后,android.media.AUDIO_BECOMING_NOISY事件已经被发送了。所以我猜测有些东西已经在内部实现了,但没有作为API公开。 - Ornithopter
随着Pixel 2的推出,我们遇到了这个问题,因为该手机上没有耳机插孔。我们需要一种方法来判断耳机是否已插入——即使是通过转接器。 - Jason Williams
2个回答

3
作为EscapeArtist提出的方法的补充,您还可以监听UsbManager.ACTION_USB_DEVICE_ATTACHEDUsbManager.ACTION_USB_DEVICE_DETACHED操作,并检查当前连接的USB设备是否具有音频接口UsbConstants.USB_CLASS_AUDIO。不幸的是,对于复合(不用担心措辞)USB设备,例如OTG +标准USB耳机或仅USB-C耳机,AudioManager.ACTION_HEADSET_PLUG不会触发。
  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 扩展函数,用于搜索是否有专用音频接口的 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


对于USB-C耳机:在Android 9中广播ACTION_HEADSET_PLUG,但在Android 7.1中没有(没有Android 8设备可以检查)。使用UsbManager更可靠。谢谢。 - snachmsm

2
您可以注册一个具有AudioManager.ACTION_HEADSET_PLUG筛选器的BroadcastReceiver
然后在您的接收器中,您可以通过devices = audioManager.getDevices(GET_DEVICES_OUTPUTS)获取连接设备的列表。
然后,您可以通过检查类型来过滤该列表以查找USB耳机:device.type == AudioDeviceInfo.TYPE_USB_HEADSET
您可能还想查看TYPE_WIRED_HEADPHONETYPE_WIRED_HEADSETTYPE_LINE_ANALOG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接