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, al menos, una de las siguientes salidas de audio disponibles:
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
(en dispositivos que tienen una bocina integrada)AudioDeviceInfo.TYPE_BLUETOOTH_A2DP
(cuando se vinculan y se conectan auriculares Bluetooth)AudioDeviceInfo.TYPE_BLE_BROADCAST
(cuando se vincula y conecta un dispositivo del grupo de transmisión Bluetooth de bajo consumo [BLE])AudioDeviceInfo.TYPE_BLE_HEADSET
(cuando se vinculan y se conectan auriculares BLE)AudioDeviceInfo.TYPE_BLE_SPEAKER
(cuando se vincula y conecta una bocina BLE)
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.
Permitir que el usuario elija un dispositivo de salida multimedia
A partir de Wear OS 5, el sistema proporciona una IU que permite a los usuarios elegir qué el dispositivo debería reproducir contenido multimedia y mostrar información sobre el contenido que se está reproduciendo en ese momento contenido.
Si la app detecta que no hay auriculares Bluetooth conectados cuando lo deseas
Para reproducir audio en dispositivos con Wear OS 5 o versiones posteriores, ofrece
al usuario directamente en el selector de salida multimedia. En los dispositivos que no admiten
selector de salida multimedia, invoca el intent ACTION_BLUETOOTH_SETTINGS
, que lleva al usuario a la página de Bluetooth en la configuración del sistema.
El método launchOutputSelection()
, que forma parte de la biblioteca Horologist
en GitHub, se muestra cómo permitir que el usuario elija su dispositivo de salida multimedia.
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,
registrar una devolución de llamada para detectar cuándo
el usuario conecta y desconecta los auriculares Bluetooth mediante
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:
Llama a setSuppressPlaybackOnUnsuitableOutput(true) mientras compilas la instancia de ExoPlayer:
ExoPlayer exoplayer = ExoPlayer.Builder(context) .setAudioAttributes(...) .setSuppressPlaybackWhenUnsuitableOutput(true) // ... .build()
-
Como reacción al evento de supresión de reproducción, registra WearUnsuitableOutputPlaybackSuppressionResolverListener como objeto de escucha de la instancia de ExoPlayer:
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
- Asegúrate de que la reproducción de audio multimedia no comience, a menos que hayas conectado un dispositivo de salida adecuado al reloj, como auriculares o un conjunto de bocinas externas. Consulta la siguiente lista de dispositivos de salida adecuados para apps de música:
- Pausa la reproducción si AudioManager notifica a la app que un dispositivo de salida de audio externo se desconecta del reloj.
- Cuando el usuario intente iniciar la reproducción de contenido multimedia, pero no haya conectado un dispositivo de audio externo, pídele que lo conecte al reloj.