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

В этом руководстве описывается, как приложения на 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 уже содержит логику, предотвращающую непреднамеренное воспроизведение мультимедиа на встроенных динамиках часов.

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