在可穿戴设备上播放音频

关键词:可穿戴设备、媒体、collection_guideslandingwear

本指南介绍 Wear OS 上的应用如何使用熟悉的 Android API 播放音频。

检测音频设备

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)

为了提供最佳用户体验,您的应用应确保仅在蓝牙耳机或扬声器连接到手表时播放媒体。

选择首选音频输出设备

根据您的应用用例以及音频对应用核心体验的重要性,选择您希望用户如何与应用的音频输出互动。

允许用户选择媒体输出设备

从 Wear OS 5 开始,系统提供了一个 UI,允许用户选择哪个设备播放媒体,并显示有关当前播放媒体内容的信息。

如果您的应用检测到在您想要在运行 Wear OS 5 或更高版本的设备上提供音频播放时未连接蓝牙耳机,请提供将用户直接带到媒体输出切换器的选项。在不支持媒体输出切换器的设备上,调用ACTION_BLUETOOTH_SETTINGS 意图操作,这会将用户带到系统设置中的蓝牙页面。

launchOutputSelection() 方法(GitHub 上 Horologist 库的一部分)演示了如何让用户选择其媒体输出设备。

蓝牙耳机

与始终可用的内置扬声器不同,蓝牙耳机可以在应用运行时进行配对或取消配对。如果应用需要耳机才能继续运行,请注册一个回调以检测用户何时使用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)
  

如果您的应用检测到在您想要提供音频输出时未连接蓝牙耳机,请不要显示错误消息。相反,请提供将用户直接带到蓝牙设置的选项,以便他们更容易连接。这可以通过发送包含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. 在构建 ExoPlayer 实例时调用setSuppressPlaybackOnUnsuitableOutput(true)

      ExoPlayer exoplayer = ExoPlayer.Builder(context)
              .setAudioAttributes(...)
              .setSuppressPlaybackWhenUnsuitableOutput(true)
              // ...
              .build()
          
  2. 通过将WearUnsuitableOutputPlaybackSuppressionResolverListener 注册为 ExoPlayer 实例的侦听器来响应播放抑制事件。

  3.   exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
        

Horologist 媒体工具包

Horologist MediaToolkit 已经包含了防止意外在内置手表扬声器上播放媒体的逻辑。

其他媒体播放器