В этом руководстве описывается, как приложения на Wear OS могут использовать знакомые API Android для воспроизведения звука.
Обнаружение аудиоустройств
Приложение Wear OS должно сначала определить, есть ли у носимого устройства соответствующий аудиовыход. Разработчики могут ожидать, что у носимых устройств будет как минимум один из следующих доступных аудиовыходов:
-
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
: на устройствах со встроенным динамиком -
AudioDeviceInfo.TYPE_BLUETOOTH_A2DP
: когда гарнитура Bluetooth сопряжена и подключена -
AudioDeviceInfo.TYPE_BLE_BROADCAST
: когда устройство группы вещания Bluetooth Low Energy (BLE) сопряжено и подключено -
AudioDeviceInfo.TYPE_BLE_HEADSET
: когда гарнитура BLE сопряжена и подключена -
AudioDeviceInfo.TYPE_BLE_SPEAKER
: когда динамик BLE сопряжен и подключен
В следующем примере приложение использует метод getDevices()
в сочетании со значением FEATURE_AUDIO_OUTPUT
для перечисления всех аудиовыходов.
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 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 } } // True if the device has a speaker audioOutputAvailable(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER) // True if a Bluetooth headset is paired and connected audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP) // True if a BLE broadcast group device is paired and connected audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST) // True if a BLE headset is paired and connected audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET) // True if a BLE speaker is paired and connected audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER)
Чтобы обеспечить наилучший пользовательский опыт, ваше приложение должно воспроизводить медиафайлы только при подключении к часам наушников или динамиков Bluetooth.
Выберите предпочтительное устройство для вывода звука
В зависимости от варианта использования вашего приложения и важности звука для его основного опыта выберите, как пользователи будут взаимодействовать с аудиовыходом вашего приложения.
Позвольте пользователю выбирать устройство вывода мультимедиа
Начиная с Wear OS 5, система предоставляет пользовательский интерфейс, который позволяет пользователям выбирать, какое устройство должно воспроизводить медиа, а также отображать информацию о воспроизводимом в данный момент медиаконтенте.
Если ваше приложение обнаруживает, что гарнитура Bluetooth не подключена, когда вы хотите обеспечить воспроизведение звука на устройствах под управлением Wear OS 5 или выше, предложите пользователю перейти непосредственно к переключателю вывода мультимедиа. На устройствах, которые не поддерживают переключатель вывода мультимедиа, вызовите действие намерения ACTION_BLUETOOTH_SETTINGS
, которое перенаправляет пользователя на страницу Bluetooth в системных настройках.
Метод launchOutputSelection()
, входящий в библиотеку Horologist на GitHub, демонстрирует, как позволить пользователю выбирать устройство вывода мультимедиа.
Bluetooth-гарнитура
В отличие от встроенных динамиков, которые всегда доступны, если они есть на устройстве, Bluetooth-гарнитуру можно подключить или отключить во время работы приложения. Если приложению требуется гарнитура для продолжения работы, зарегистрируйте обратный вызов, чтобы определить, когда пользователь подключает и отключает Bluetooth-гарнитуру, используя registerAudioDeviceCallback
:
audioManager.registerAudioDeviceCallback(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. } } }, null)
Если ваше приложение обнаруживает, что гарнитура Bluetooth не подключена, когда вы хотите предоставить аудиовыход, не показывайте сообщение об ошибке. Вместо этого предложите пользователю перейти непосредственно к настройкам Bluetooth, чтобы упростить подключение. Это можно сделать, отправив намерение с помощью ACTION_BLUETOOTH_SETTINGS
:
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) putExtra("EXTRA_CLOSE_ON_CONNECT", true) putExtra("android.bluetooth.devicepicker.extra.FILTER_TYPE", 1) } startActivity(intent)
Встроенные динамики
Большинство устройств Wear OS имеют встроенные динамики. Если ваше приложение предлагает немедийный вариант использования, включающий звук, рассмотрите возможность использования динамиков, чтобы предложить дополнительное измерение взаимодействия с пользователем. Например, устройство Wear OS, оснащенное динамиком, может запустить будильник часов или таймера, дополненный звуковым уведомлением, а фитнес-приложения могут использовать динамик для предоставления инструкций по выполнению упражнений.
Примечание: Встроенные динамики не обеспечивают наилучшего качества прослушивания медиаконтента, поскольку они не предназначены для этой цели.
Подробную информацию смотрите в WearSpeakerSample .
Воспроизвести аудио
После того, как вы обнаружите и выберете подходящий аудиовыход, процесс воспроизведения звука на Wear OS будет таким же, как на мобильных устройствах или других устройствах. Для получения дополнительной информации см. Обзор MediaPlayer . Для более легкого доступа к более продвинутым функциям, таким как потоковая передача и загрузка мультимедиа, используйте ExoPlayer . Обязательно следуйте рекомендациям для аудиоприложений, таким как Управление аудиофокусом.
Предотвращение непреднамеренного воспроизведения мультимедиа через встроенные динамики
Медиа-приложения могут следовать следующим указаниям, чтобы убедиться, что приложение не воспроизводит непреднамеренно медиа-контент на встроенных динамиках часов. Указания различаются в зависимости от того, какой проигрыватель использует приложение.
ExoPlayer
Если ваше приложение использует ExoPlayer:
Вызовите setSuppressPlaybackOnUnsuitableOutput(true) во время создания экземпляра ExoPlayer:
ExoPlayer exoplayer = ExoPlayer.Builder(context) .setAudioAttributes(...) .setSuppressPlaybackWhenUnsuitableOutput(true) // ... .build()
Отреагируйте на событие подавления воспроизведения, зарегистрировав WearUnsuitableOutputPlaybackSuppressionResolverListener в качестве прослушивателя экземпляра ExoPlayer:
exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
Инструментарий Horologist Media
Horologist MediaToolkit уже содержит логику, предотвращающую непреднамеренное воспроизведение мультимедиа на встроенных динамиках часов.
Другие медиаплееры
- Убедитесь, что воспроизведение аудио мультимедиа не начинается, пока к часам не подключено подходящее выходное устройство, например гарнитура или набор внешних динамиков. Ниже приведен список подходящих выходных устройств для приложений мультимедиа:
- Приостановите воспроизведение, если AudioManager уведомит ваше приложение об отключении внешнего устройства вывода звука от часов .
- Если пользователь пытается запустить воспроизведение мультимедиа, но не подключил внешнее аудиоустройство, предложите пользователю подключить такое устройство к часам.