У меня есть функция, в которой мне нужно получить ток И обнаружить переключатель активного устройства вывода звука системы. Что-то вроде:
- запустить приложение -> получить текущее устройство (которое может быть встроенными динамиками)
- подключить динамик 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, надежно ?