Este guia descreve como apps no Wear OS podem usar APIs conhecidas do Android para tocar áudio.
Detectar dispositivos de áudio
Os apps para Wear OS precisam primeiro detectar se o dispositivo wearable tem uma saída de áudio adequada. Os desenvolvedores podem esperar que os wearables tenham pelo menos uma das seguintes saídas de áudio disponíveis:
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
: em dispositivos com um alto-falante integradoAudioDeviceInfo.TYPE_BLUETOOTH_A2DP
: quando um fone de ouvido Bluetooth estiver pareado e conectadoAudioDeviceInfo.TYPE_BLE_BROADCAST
: quando um dispositivo do grupo de transmissão Bluetooth de baixa energia (BLE) estiver pareado e conectadoAudioDeviceInfo.TYPE_BLE_HEADSET
: quando um fone de ouvido BLE estiver pareado e conectadoAudioDeviceInfo.TYPE_BLE_SPEAKER
: quando um alto-falante BLE estiver pareado e conectado
No exemplo abaixo, o app usa o método
getDevices()
com o valor de FEATURE_AUDIO_OUTPUT
para enumerar todas as saídas de
áudio.
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 oferecer a melhor experiência ao usuário, seu app precisa tocar mídia somente quando fones de ouvido ou alto-falantes Bluetooth estiverem conectados ao relógio.
Escolher o dispositivo preferido para saída de áudio
Dependendo do caso de uso do seu app e da importância do áudio para a experiência principal dele, escolha como você quer que os usuários interajam com a saída de áudio.
Permitir que o usuário escolha o dispositivo de saída de mídia
A partir do Wear OS 5, o sistema oferece uma interface que permite aos usuários escolher dispositivo deve abrir mídia e mostrar informações sobre a mídia em reprodução no momento conteúdo.
Se o aplicativo detectar que não há um fone de ouvido Bluetooth conectado quando você quiser
para oferecer reprodução de áudio em dispositivos com Wear OS 5 ou versões mais recentes,
o usuário diretamente
ao seletor de saída de mídia. Em dispositivos que não têm suporte para
seletor de saída de mídia, invoque a intent ACTION_BLUETOOTH_SETTINGS
que leva o usuário para a página de Bluetooth nas configurações do sistema.
O método launchOutputSelection()
, parte da biblioteca do Horologist
no GitHub, demonstra como permitir que o usuário escolha o dispositivo de saída de mídia.
Fone de ouvido Bluetooth
Ao contrário dos alto-falantes integrados, que estão sempre disponíveis quando presentes no dispositivo, um fone de ouvido Bluetooth
pode ser pareado ou despareado enquanto um app está em execução. Se o app exigir um fone de ouvido para continuar,
registrar um callback para detectar quando
o usuário conecta e desconecta um fone de ouvido Bluetooth usando
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)
Se o app detectar que não há um fone de ouvido Bluetooth conectado quando você quiser fornecer
uma saída de áudio, não mostre uma mensagem de erro. Em vez disso, ofereça a opção de direcionar o usuário às configurações de Bluetooth
para facilitar a conexão. Para isso, envie uma intent com
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)
Alto-falantes
A maioria dos dispositivos Wear OS tem alto-falantes. Se o app oferece um caso de uso que não é de mídia e incorpora som, use alto-falantes para oferecer uma dimensão extra de engajamento com o usuário. Por exemplo, um dispositivo Wear OS com alto-falantes pode acionar alarmes de relógio ou timers, completos com notificações de áudio, e os apps fitness podem usar o alto-falante para fornecer instruções de exercício.
Observação: os alto-falantes não oferecem a melhor experiência para ouvir conteúdo de mídia, já que não foram projetados para essa finalidade.
Consulte WearSpeakerSample (link em inglês) para mais detalhes.
Tocar áudio
Depois de detectar uma saída de áudio adequada, o processo para tocar áudio no Wear OS é o mesmo usado em dispositivos móveis ou de outros tipos. Para saber mais, consulte Visão geral da MediaPlayer. Para facilitar o acesso a recursos mais avançados, como streaming e download de mídia, use o ExoPlayer. Siga as práticas recomendadas para apps de áudio, como Gerenciar a seleção de áudio.
Impedir a reprodução não intencional de mídia pelos alto-falantes
Os apps de mídia podem seguir as orientações a seguir para garantir que o app não inicie conteúdo de mídia de forma não intencional nos alto-falantes integrados do relógio. A orientação é diferente de acordo com o player que o app está usando.
ExoPlayer
Se o app estiver usando o ExoPlayer:
Chame setSuppressPlaybackOnUnsuitableOutput(true) ao criar a instância do ExoPlayer:
ExoPlayer exoplayer = ExoPlayer.Builder(context) .setAudioAttributes(...) .setSuppressPlaybackWhenUnsuitableOutput(true) // ... .build()
-
Reaja ao evento de supressão de reprodução registrando WearUnsuitableOutputPlaybackSuppressionResolverListener como um listener da instância do ExoPlayer:
exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
Kit de ferramentas de mídia do Horologist
O Horologist MediaToolkit (link em inglês) já contém lógica para evitar a reprodução não intencional de mídia em alto-falantes integrados do relógio.
Outros players de mídia
- Garanta que o áudio de conteúdo de mídia só seja iniciado se um dispositivo de saída adequado, como um fone de ouvido ou um conjunto de alto-falantes externos, estiver conectado ao relógio. Consulte a lista a seguir para descobrir os dispositivos de saída adequados para apps de música:
- Pause a reprodução caso o AudioManager notifique seu app de que um dispositivo de saída de áudio externo foi desconectado do relógio.
- Quando o usuário tentar iniciar a reprodução de mídia, mas não tiver conectado um dispositivo de áudio externo, peça que ele conecte esse dispositivo ao relógio.