Cómo reproducir audio en wearables

En esta guía, se describe el modo en que las apps en Wear OS pueden usar las APIs de Android conocidas para reproducir audio.

Detecta dispositivos de audio

Una app para Wear OS primero debe detectar si el dispositivo wearable tiene una salida de audio adecuada. Los desarrolladores pueden esperar que los wearables tengan disponible al menos una de las siguientes salidas de audio:

En el siguiente ejemplo, la app usa el método getDevices() junto con el valor de FEATURE_AUDIO_OUTPUT para enumerar todas las salidas de audio.

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)

Para brindar la mejor experiencia del usuario, la app debe asegurarse de reproducir contenido multimedia solo cuando los auriculares o las bocinas Bluetooth estén conectados al reloj.

Cómo elegir el dispositivo preferido para la salida de audio

Según el caso de uso de la app y la importancia del audio para la experiencia principal de la app, elige cómo te gustaría que los usuarios interactúen con la salida de audio de la app.

Auriculares Bluetooth

A diferencia de las bocinas integradas, que siempre están disponibles si el dispositivo cuenta con ellas, los auriculares Bluetooth se pueden vincular o desvincular mientras se ejecuta una app. Si la app requiere auriculares para continuar,

registra una devolución de llamada para detectar cuándo el usuario conecta y desconecta los auriculares Bluetooth con 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)
  

Si la app detecta que no hay auriculares Bluetooth conectados cuando quieres proporcionar una salida de audio, no muestres un mensaje de error. En cambio, ofrece llevar al usuario directamente a la configuración de Bluetooth para facilitar la conexión. Para ello, se envía un intent con 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)
  

Bocinas

La mayoría de los dispositivos Wear OS tienen bocinas. Si la app ofrece un caso de uso que no es multimedia y que incorpora sonido, considera usar bocinas para ofrecer una dimensión adicional de participación con el usuario. Por ejemplo, un dispositivo Wear OS con bocina incorporada podría activar un reloj o una alarma de cronómetro, con notificaciones de audio, y las apps de fitness podrían usar la bocina para proporcionar instrucciones de ejercicio.

Nota: Las bocinas no ofrecen la mejor experiencia para escuchar contenido multimedia, ya que no están diseñadas para ese eso.

Consulta WearSpeakerSample para obtener más información.

Cómo reproducir audio

Una vez que se detecta y elige una salida de audio adecuada, el proceso de reproducción de audio en Wear OS es el mismo que en el dispositivo móvil o algún otro dispositivo. Para obtener más información, consulta Descripción general de MediaPlayer. Para facilitar el acceso a funciones más avanzadas, como la transmisión y la descarga de contenido multimedia, utiliza ExoPlayer. Asegúrate de seguir las prácticas recomendadas para apps de audio, por ejemplo, Cómo administrar el foco de audio

Cómo evitar la reproducción involuntaria de contenido multimedia a través de las bocinas

Las apps de música pueden seguir estas instrucciones para asegurarse de no reproducir contenido multimedia de manera accidental en las bocinas integradas del reloj. La guía es diferente según el reproductor que use la app.

ExoPlayer

Si la app usa ExoPlayer, haz lo siguiente:

  1. Llama a setSuppressPlaybackOnUnsuitableOutput(true) mientras compilas la instancia de ExoPlayer:

      ExoPlayer exoplayer = ExoPlayer.Builder(context)
              .setAudioAttributes(...)
              .setSuppressPlaybackWhenUnsuitableOutput(true)
              // ...
              .build()
          
  2. Como reacción al evento de supresión de reproducción, registra WearUnsuitableOutputPlaybackSuppressionResolverListener como objeto de escucha de la instancia de ExoPlayer:

  3.   exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
        

Kit de herramientas de contenido multimedia de Horologist

El kit de herramientas de contenido multimedia de Horologist ya contiene lógica para evitar la reproducción de contenido multimedia involuntaria en las bocinas integradas del reloj.

Otros reproductores multimedia