Как надежно извлечь и обнаружить изменения в активном аудио маршруте на Android? - PullRequest
1 голос
/ 13 апреля 2020

У меня есть функция, в которой мне нужно получить ток И обнаружить переключатель активного устройства вывода звука системы. Что-то вроде:

  • запустить приложение -> получить текущее устройство (которое может быть встроенными динамиками)
  • подключить динамик Bluetooth -> обнаружить переключатель на динамик Bluetooth
  • подключить аудио jack -> обнаружение переключения с динамика Bluetooth на аудиоразъем

Мне кажется, для этого должен быть один API, но, кажется, их несколько. Кажется, что наиболее разумным является MediaRouter, но есть две большие проблемы, которые мешают мне использовать его, как описано выше:

  • Есть как минимум 2 сценария ios в который выбирает неправильное устройство в качестве активного маршрута, а в других сценариях ios он прямо вверх не обнаруживает переключений маршрутов вообще. Для получения подробной информации об этом, пожалуйста, проверьте билет, который я открыл в системе отслеживания проблем Google
  • Мне нужна определенная информация о текущем активном устройстве вывода, наиболее важный универсальный идентификатор. Для устройств Bluetooth, для этого можно использовать Complete Local Name, который доступен для BluetoothDevice типов, но его нельзя получить от MediaRouter. Вместо этого MediaRouter делает доступным productName, который иногда может быть псевдонимом устройств Bluetooth, а не именем stati c.

У меня с тех пор отказались от этого API и пошли дальше, чтобы найти другие решения, дайте мне знать, если кто-то думает, что есть способ обойти вышеупомянутые проблемы, самое главное первое. Отмечу, что я использовал и android.media.MediaRouter, и androidx, у них обоих есть эти проблемы.

Сейчас я использую комбинацию других API. Это работает, но это далеко от приемлемого решения:

  • Использование AudioManager.registerAudioDeviceCallback(object : AudioDeviceCallback) для обнаружения устройств без Bluetooth (AudioDeviceInfo.TYPE_WIRED_HEADPHONES, AudioDeviceInfo.TYPE_BUILTIN_SPEAKER)). Я получаю обратные вызовы, когда любое из этих устройств добавляется или удаляется, и затем я могу проверить, присутствует ли устройство типа проводной , то это активное 100% времени, если нет, то встроенное Тип активен. Это немного странно, но работает.

  • Что еще интереснее, для обнаружения устройств вывода Bluetooth я использую закрытый API, который Android сам использует в приложении «Настройки» для отображения текущего устройства вывода звука .

    • BluetoothA2dp::class.java.getDeclaredMethod("getActiveDevice") для получения текущего активного устройства вывода. Это делается путем получения прокси-службой профиля bluetoothAdapter.getProfileProxy
    • регистрации получателя для этого действия BluetoothA2dp::class.java.getField("ACTION_ACTIVE_DEVICE_CHANGED").get(null) для обнаружения переключателей активного аудиоустройства Bluetooth.

Это решение работает, но также имеет несколько ограничений:

  • это очевидные частные API, подверженные внезапным изменениям и потенциальным сбоям
  • активное устройство API, упомянутые выше, недоступны
  • На устройствах Samsung активное устройство API работает неправильно.

Итак, вопрос на миллион долларов. Как мне выбрать и определить текущий аудио маршрут на Android, надежно ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...