【问题标题】:USB type-c headset detection in AndroidAndroid中的USB type-c耳机检测
【发布时间】:2017-01-11 05:39:12
【问题描述】:

对不起。这是我第一次来这里。我在网上做了一些搜索,但没有结果。真的需要帮助来澄清这个问题。 我有两个关于 USB 耳机检测和状态查询的问题。

  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 公开。
  • 随着 Pixel 2 的推出,我们遇到了这个问题,因为该手机上没有耳机插孔。我们需要一种方法来判断耳机是否已插入——即使是通过加密狗。

标签: android headset


【解决方案1】:

您可以使用AudioManager.ACTION_HEADSET_PLUG 的过滤器注册BroadcastReceiver

然后在您的接收器中,您可以获得已连接设备的列表 devices = audioManager.getDevices(GET_DEVICES_OUTPUTS)

然后您可以通过检查类型来查找 USB 耳机来过滤该列表:

device.type == AudioDeviceInfo.TYPE_USB_HEADSET

您可能还想查看 TYPE_WIRED_HEADPHONE、TYPE_WIRED_HEADSET、TYPE_LINE_ANALOG

【讨论】:

    【解决方案2】:

    除了 EscapeArtist 提出的方法之外,您还可以监听UsbManager.ACTION_USB_DEVICE_ATTACHEDUsbManager.ACTION_USB_DEVICE_DETACHED 的动作,并检查当前连接的USB 设备是否有音频接口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搜索枯萎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 耳机:ACTION_HEADSET_PLUG 在 Android 9 中广播,不在 Android 7.1 中(没有要检查的 Android 8 设备)。使用UsbManager 更可靠。谢谢
    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2011-09-09
    • 2020-08-17
    • 2023-03-10
    相关资源
    最近更新 更多