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

В этом руководстве описывается, как приложения на 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() , входящий в состав библиотеки Horological на 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:

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

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

  3.   exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
        

Медиа-инструментарий часовщика

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

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