Обнаружение USB-гарнитуры типа c в Android

Извините за вопрос. Это мой первый раз здесь. Я сделал поиск в сети, но безрезультатно. Действительно нужна помощь, чтобы прояснить эту проблему. У меня два вопроса по поводу обнаружения USB-гарнитуры и запроса статуса.

  1. Мое целевое устройство работает под управлением Android версии 7.1.1. Устройство имеет USB-разъем типа c и поддерживает USB-гарнитуру типа c. Однако кажется, что AudioService не отправит намерение при изменении состояния USB-гарнитуры. Должен ли OEM реализовать свои собственные намерения в этом случае?

  2. Для традиционной проводной гарнитуры я могу использовать AudioManager.isWiredHeadsetOn(), чтобы проверить ее состояние. Но USB-гарнитура типа c, похоже, не работает таким образом. Есть ли другой способ получить статус USB-гарнитуры?

Спасибо лей

2 ответа

Вы можете зарегистрировать 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

В дополнение к предложенному EscapeArtist подходу, вы также можете прослушать UsbManager.ACTION_USB_DEVICE_ATTACHED а также UsbManager.ACTION_USB_DEVICE_DETACHED действия и проверьте, имеет ли текущее подключенное USB-устройство аудио интерфейс UsbConstants.USB_CLASS_AUDIO, К несчастью, AudioManager.ACTION_HEADSET_PLUG не запускается для композитных (не парьтесь) слов USB-устройств, таких как стандартные USB-наушники OTG + или только для наушников 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,

Другие вопросы по тегам