Os usuários esperam poder controlar o volume de um app de áudio. Comportamento padrão inclui a capacidade de usar os controles de volume (botões ou botões no dispositivo ou controles deslizantes na interface do usuário) e para evitar tocar repentinamente em voz alta se um periféricos, como fones de ouvido, ficam desconectados durante o uso.
Como usar os controles de volume
Quando um usuário pressiona uma tecla de volume em um jogo ou app de música, o volume deve mudar, mesmo se o player estiver pausado entre as músicas ou não houver música para a localização atual do jogo.
O Android usa streams de áudio separados para tocar músicas, alarmes e notificações, toque de chamada recebida, sons do sistema, volume na chamada e DTMF tons. Isso permite que os usuários controlem o volume de cada stream de forma independente.
Por padrão, pressionar o controle de volume modifica o volume do áudio ativo riacho. Se o app não estiver tocando nada, pressione as teclas de volume ajusta o volume da música (ou o volume da campainha em versões anteriores ao Android 9).
A menos que seu app seja um despertador, você deve tocar áudio durante o uso
AudioAttributes.USAGE_MEDIA
:
Para garantir que os controles de volume
se ajustem
no fluxo correto, chame
setVolumeControlStream()
transmitindo o tipo de stream correspondente aos atributos que você pode recuperar
AudioAttributes.getVolumeControlStream
.
Kotlin
setVolumeControlStream(AudioManager.STREAM_MUSIC)
Java
setVolumeControlStream(AudioManager.STREAM_MUSIC);
Faça essa chamada no ciclo de vida do app, normalmente do onResume()
.
da atividade ou fragmento que controla a mídia. Isso conecta
Os controles de volume para STREAM_MUSIC
sempre que a atividade ou o fragmento de destino
está visível.
Como controlar o volume de stream de maneira programática
Em casos raros, você pode definir o volume de um stream de áudio programaticamente. Para
exemplo, quando seu app substitui uma interface já existente. Isso não é recomendado porque
a AudioManager
do Android combina todos os streams de áudio do mesmo tipo.
Esses métodos mudam o volume de cada app que usa o stream. Evite usar
eles:
adjustStreamVolume()
adjustSuggestedStreamVolume()
adjustVolume()
setStreamVolume() setStreamVolume()
setStreamSolo()
setStreamMute()
Como trabalhar com dispositivos de volume fixo
Alguns dispositivos, como os Chromebooks, têm controles de volume, mas não permitem que apps usem o AudioManager
métodos descritos acima para alterar o nível de um stream de áudio. Eles são chamados
dispositivos com volume fixo. Você pode descobrir
está sendo executado em um dispositivo de volume fixo chamando isVolumeFixed()
.
Um app de áudio precisa oferecer a capacidade de equilibrar
o volume de saída com outros apps que possam estar em reprodução no mesmo stream.
Em dispositivos de volume fixo, o app deve conectar os próprios controles de volume ao
método setVolume()
apropriado na tabela abaixo:
Jogador | Método |
---|---|
Faixa de áudio | AudioTrack.setVolume() |
MediaPlayer | MediaPlayer.setVolume() |
ExoPlayer | Use SimpleExoPlayer.setVolume() , que define o volume da faixa de áudio subjacente. |
Não seja barulhento
Os usuários têm várias alternativas quando se trata de aproveitar o áudio de dispositivos Android. A maioria dos dispositivos tem um alto-falante integrado, entrada para fone de ouvido fones de ouvido com fio, e muitos também possuem conectividade Bluetooth e suporte para Áudio A2DP.
Quando um fone de ouvido ou um dispositivo Bluetooth estiver desconectado, o stream de áudio redireciona automaticamente para o alto-falante integrado. Se você ouve música em alta volume, isso pode ser uma surpresa barulhenta.
Os usuários geralmente esperam apps que incluam um player de música com reprodução na tela para pausar a reprodução nesse caso. Outros apps, como jogos incluir controles, devem continuar tocando. O usuário pode ajustar o volume com o controles de hardware do dispositivo.
Quando a saída de áudio volta para o alto-falante integrado, o sistema transmite um ACTION_AUDIO_BECOMING_NOISY
intenção. Crie um BroadcastReceiver
que ouve essa intent sempre que você estiver reproduzindo áudio. Seu receptor terá esta aparência:
Kotlin
private class BecomingNoisyReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.action == AudioManager.ACTION_AUDIO_BECOMING_NOISY) { // Pause the playback } } }
Java
private class BecomingNoisyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) { // Pause the playback } } }
Registre o receptor quando começar a reprodução e cancele o registro quando parar.
Se você desenvolver seu aplicativo como descrevemos neste guia, essas chamadas devem aparecer
nos callbacks de sessão de mídia onPlay()
e onStop()
.
Kotlin
private val intentFilter = IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY) private val myNoisyAudioStreamReceiver = BecomingNoisyReceiver() private val callback = object : MediaSessionCompat.Callback() { override fun onPlay() { registerReceiver(myNoisyAudioStreamReceiver, intentFilter) } override fun onStop() { unregisterReceiver(myNoisyAudioStreamReceiver) } }
Java
private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY); private BecomingNoisyReceiver myNoisyAudioStreamReceiver = new BecomingNoisyReceiver(); MediaSessionCompat.Callback callback = new MediaSessionCompat.Callback() { @Override public void onPlay() { registerReceiver(myNoisyAudioStreamReceiver, intentFilter); } @Override public void onStop() { unregisterReceiver(myNoisyAudioStreamReceiver); } }