Android中的USB type-c耳机检测

时间:2017-01-11 05:39:12

标签: android headset

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

  1. 我的目标设备正在运行Android 7.1.1版。该设备具有USB type-c连接器并支持USB type-c耳机。但是,当USB耳机状态发生变化时,似乎AudioService不会发送意图。 OEM是否必须为此案例实现自己的意图?

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

  3. 谢谢, 雷

2 个答案:

答案 0 :(得分:1)

除了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

答案 1 :(得分:0)

您可以使用BroadcastReceiver

的过滤器注册AudioManager.ACTION_HEADSET_PLUG

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

然后,您可以通过查看类型:

来查找USB耳机来过滤该列表

device.type == AudioDeviceInfo.TYPE_USB_HEADSET

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