В этом руководстве рассказывается, как использовать знакомые API Android для воспроизведения аудио в приложениях Wear OS.
Как обнаружить аудиоустройства
Приложение для Wear OS должно сначала определить, есть ли у носимого устройства подходящий аудиовыход. У носимых устройств обычно есть хотя бы один из следующих аудиовыходов:
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER– на устройствах со встроенным динамиком.AudioDeviceInfo.TYPE_BLUETOOTH_A2DP– когда гарнитура Bluetooth подключена и сопряжена.AudioDeviceInfo.TYPE_BLE_BROADCAST– когда устройство Bluetooth с низким энергопотреблением (BLE) из группы трансляции сопряжено и подключено.AudioDeviceInfo.TYPE_BLE_HEADSET– когда гарнитура BLE подключена.AudioDeviceInfo.TYPE_BLE_SPEAKER– когда колонка с поддержкой BLE подключена.
В следующем примере используется метод getDevices() со значением FEATURE_AUDIO_OUTPUT, чтобы проверить, доступен ли тип аудиовыхода.
private val audioManager: AudioManager by lazy { getSystemService(AUDIO_SERVICE) as AudioManager } fun audioOutputAvailable(type: Int): Boolean { if (!packageManager.hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT)) { return false } return audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS).any { it.type == type } }
Затем вы можете использовать этот метод, чтобы проверить, доступен ли тип аудиовыхода.
val hasSpeaker = audioOutputAvailable(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER) val hasBluetoothHeadset = audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP) val hasBLEBroadcast = audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST) val hasBLEHeadset = audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET) val hasBLESpeaker = audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER)
Чтобы обеспечить наилучшее удобство использования, включайте мультимедиа только при подключении к часам наушников Bluetooth или колонок.
Как выбрать устройство по умолчанию для вывода аудио
В зависимости от назначения приложения и важности аудио для его работы выберите, как пользователи будут взаимодействовать с аудиоконтентом.
Разрешить пользователю выбирать устройство вывода мультимедиа
В Wear OS 5 и более поздних версий есть интерфейс, в котором можно выбрать устройство для воспроизведения медиаконтента и посмотреть информацию о нем.
Если ваше приложение обнаруживает, что при воспроизведении аудио на устройстве с Wear OS 5 или более поздней версии не подключена Bluetooth-гарнитура, предложите пользователю перейти к переключателю вывода мультимедиа. На устройствах, которые не поддерживают переключатель вывода медиаконтента, вызовите действие ACTION_BLUETOOTH_SETTINGS intent, которое перенаправит пользователя на страницу Bluetooth в системных настройках.
launchOutputSelection() Метод, входящий в библиотеку Horologist на GitHub, показывает, как разрешить пользователям выбирать устройство вывода медиаконтента.
Bluetooth-гарнитура
В отличие от встроенных динамиков, которые всегда доступны, если они есть на устройстве, Bluetooth-гарнитуру можно подключить или отключить во время работы приложения. Если для работы приложения требуется гарнитура, зарегистрируйте обратный вызов, чтобы определять, когда пользователь подключает и отключает гарнитуру Bluetooth, с помощью registerAudioDeviceCallback:
val audioDeviceCallback = object : AudioDeviceCallback() { override fun onAudioDevicesAdded(addedDevices: Array<out AudioDeviceInfo>?) { super.onAudioDevicesAdded(addedDevices) if (audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP) || audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST) || audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET) || audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER) ) { // A Bluetooth or BLE device is connected and available for playback. } } override fun onAudioDevicesRemoved(removedDevices: Array<out AudioDeviceInfo>?) { super.onAudioDevicesRemoved(removedDevices) if (!(audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP)) && !(audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST)) && !(audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET)) && !(audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER)) ) { // No Bluetooth or BLE devices are connected anymore. } } } audioManager.registerAudioDeviceCallback(audioDeviceCallback, /*handler=*/ null)
Если приложение обнаруживает, что Bluetooth-гарнитура не подключена, когда вы хотите воспроизвести звук, не показывайте сообщение об ошибке. Вместо этого предложите пользователю перейти в настройки Bluetooth, чтобы ему было проще подключиться. Для этого отправьте намерение с параметром ACTION_BLUETOOTH_SETTINGS:
fun Context.launchBluetoothSettings(closeOnConnect: Boolean = true) { val intent = with(Intent(Settings.ACTION_BLUETOOTH_SETTINGS)) { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) putExtra("EXTRA_CONNECTION_ONLY", true) if (closeOnConnect) { putExtra("EXTRA_CLOSE_ON_CONNECT", true) } putExtra("android.bluetooth.devicepicker.extra.FILTER_TYPE", FILTER_TYPE_AUDIO) } startActivity(intent) } internal const val FILTER_TYPE_AUDIO = 1
Встроенные динамики
У большинства устройств Wear OS есть встроенные динамики. Если в вашем приложении есть функции, не связанные с медиаконтентом, но использующие звук, попробуйте добавить поддержку колонок, чтобы сделать взаимодействие с приложением более интересным. Например, устройство Wear OS с динамиком может воспроизводить звуковые уведомления о будильнике или таймере, а фитнес-приложения могут использовать динамик для инструкций по выполнению упражнений.
Подробнее о WearSpeakerSample…
Воспроизвести аудио
После того как вы обнаружите и выберете подходящий аудиовыход, воспроизведение аудио на Wear OS будет таким же, как на мобильном устройстве или других устройствах. Подробнее о MediaPlayer… Чтобы упростить доступ к продвинутым функциям, например потоковой передаче и скачиванию медиаконтента, используйте ExoPlayer. Следуйте рекомендациям для аудиоприложений, например управляйте аудиофокусом.
Как предотвратить случайное воспроизведение медиаконтента через встроенные динамики
Разработчики медиаприложений могут следовать этим рекомендациям, чтобы предотвратить случайное воспроизведение медиаконтента через встроенные динамики часов. Инструкции зависят от того, какой проигрыватель используется в вашем приложении.
ExoPlayer
Если в вашем приложении используется ExoPlayer:
- Вызовите
setSuppressPlaybackOnUnsuitableOutput(true)метод при создании экземпляра ExoPlayer:
val exoPlayer = ExoPlayer.Builder(context) .setAudioAttributes(AudioAttributes.DEFAULT, true) .setSuppressPlaybackOnUnsuitableOutput(true) .build()
- Чтобы реагировать на событие подавления воспроизведения, зарегистрируйте прослушиватель
WearUnsuitableOutputPlaybackSuppressionResolverListenerкак прослушиватель экземпляра ExoPlayer:
exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
Набор инструментов Horologist Media
В Horologist MediaToolkit уже есть логика, которая предотвращает непреднамеренное воспроизведение медиаконтента на встроенных динамиках часов.
Другие медиапроигрыватели
- Убедитесь, что воспроизведение аудио начинается только тогда, когда к часам подключено подходящее устройство вывода звука, например наушники или внешние колонки. Ниже перечислены подходящие устройства вывода для медиаприложений:
- Если
AudioManagerуведомляет ваше приложение о том, что внешнее аудиоустройство отключено от часов, приостановите воспроизведение. - Если пользователь пытается запустить воспроизведение медиаконтента, но не подключил внешнее аудиоустройство, предложите ему сделать это.