Воспроизведение звука на носимых устройствах

В этом руководстве описывается, как приложения на Wear OS могут использовать знакомые API Android для воспроизведения звука.

Обнаружение аудиоустройств

Приложение Wear OS должно сначала определить, есть ли у носимого устройства соответствующий аудиовыход. Разработчики могут ожидать, что у носимых устройств будет как минимум один из следующих доступных аудиовыходов:

В следующем примере приложение использует метод 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:

  1. Вызовите setSuppressPlaybackOnUnsuitableOutput(true) во время создания экземпляра ExoPlayer:

      ExoPlayer exoplayer = ExoPlayer.Builder(context)           .setAudioAttributes(...)           .setSuppressPlaybackWhenUnsuitableOutput(true)           // ...           .build()       
  2. Отреагируйте на событие подавления воспроизведения, зарегистрировав WearUnsuitableOutputPlaybackSuppressionResolverListener в качестве прослушивателя экземпляра ExoPlayer:

  3.   exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))     

Инструментарий Horologist Media

Horologist MediaToolkit уже содержит логику, предотвращающую непреднамеренное воспроизведение мультимедиа на встроенных динамиках часов.

Другие медиаплееры