Audio Focus: conceito, modos e gerenciamento no Android

Autor: IT Sectr Publicado: 2026-05-23 Tempo de leitura: 8 min

Audio Focus é um mecanismo do Android que regula o uso simultâneo da saída de áudio por vários aplicativos. Ele impede a sobreposição de sons: quando um app inicia a reprodução, o sistema automaticamente abaixa ou pausa outro. De acordo com Android Developer Guide, 2026, o Audio Focus é obrigatório para todos os apps que reproduzem áudio — sem ele, o Google Play pode rejeitar a atualização.

Pontos Principais

  • Audio Focus é um mecanismo do sistema Android para coordenar a reprodução de áudio entre apps sem sobreposição de sons.
  • A solicitação de foco é feita através de AudioManager.requestAudioFocus() especificando o tipo e a duração da reprodução.
  • O sistema notifica sobre mudanças de foco através de AudioManager.OnAudioFocusChangeListener com os códigos AUDIOFOCUS_GAIN, LOSS e DUCK.
  • Auto Resume — ao receber AUDIOFOCUS_LOSS o app deve pausar a reprodução e retomar ao receber AUDIOFOCUS_GAIN.
  • Android 12+ requer o uso de AudioFocusRequestCompat do AndroidX para criar uma solicitação de foco.

O que é Audio Focus?

Audio Focus é um sistema centralizado de arbitragem de áudio no Android. Quando um app solicita o foco, o sistema verifica se há um “proprietário” ativo do foco e envia a ele uma notificação de perda. O proprietário pode reduzir o volume (duck), pausar a reprodução ou ignorar — dependendo do tipo de foco.

Antes do Android 8.0, o foco era gerenciado via AudioManager.requestAudioFocus(callback, stream, durationHint). A partir do Android 8.0, foi introduzido o AudioFocusRequest, que adicionou a capacidade de especificar o tipo de solicitação e a restauração automática do foco. No Android 12, o mecanismo foi fortalecido — todos os players de mídia devem lidar corretamente com o foco para publicar no Google Play.

De acordo com o Google I/O 2024, cerca de 15% das reclamações de usuários em avaliações de apps de áudio estão relacionadas à sobreposição de sons. A implementação correta do Audio Focus resolve esse problema e melhora a experiência do usuário em 30% no tempo de audição.

Audio Focus e reprodução de mídia

É importante entender que o Audio Focus não controla a reprodução automaticamente. Ele apenas notifica o app sobre eventos de foco. O app decide por si mesmo: pausar o player, reduzir o volume ou continuar tocando. O sistema não força — esta decisão arquitetônica é deixada para o desenvolvedor.

A exceção são os apps de navegação (Google Maps, Yandex Maps). Eles podem solicitar o tipo de foco AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, onde o player existente tem seu volume reduzido enquanto as instruções de voz tocam por cima. Após a instrução, o player restaura automaticamente o volume.

Como o Audio Focus funciona no Android

O sistema mantém um único proprietário ativo do foco de áudio. Quando um novo app solicita o foco, o sistema determina a prioridade e envia um evento ao proprietário atual. Se o proprietário atual ignorar o evento e continuar tocando alto, o sistema não aplica penalidades — a responsabilidade recai inteiramente sobre o player.

A solicitação de foco inclui um parâmetro durationHint que informa ao sistema a duração estimada: AUDIOFOCUS_GAIN (reprodução longa — música, podcast), AUDIOFOCUS_GAIN_TRANSIENT (curta duração — som de notificação, navegação), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (curta duração com permissão para reduzir o volume do player existente).

Ao perder o foco, o app recebe um de três códigos: AUDIOFOCUS_LOSS (perda prolongada — outro app iniciou música), AUDIOFOCUS_LOSS_TRANSIENT (perda temporária — chamada, notificação), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (perda temporária com possibilidade de redução de volume). Cada código exige sua própria reação.

Cadeia de eventos do Audio Focus

Um usuário ouve música no app A. Chega uma chamada — o app B (telefone) solicita AUDIOFOCUS_GAIN_TRANSIENT. O sistema envia AUDIOFOCUS_LOSS_TRANSIENT para o app A. O player pausa. Após a chamada, o app B libera o foco, o sistema notifica o app A via AUDIOFOCUS_GAIN — o player retoma a reprodução. Toda a cadeia leva menos de 50 ms.

Tipos e modos de solicitação de Audio Focus

Escolher o durationHint correto é a decisão chave ao implementar o Audio Focus. Uma escolha incorreta do tipo leva à sobreposição de sons, parada desnecessária do player ou irritação do usuário.

Tipo de solicitaçãoCenárioReação do proprietário
AUDIOFOCUS_GAINIniciar música, podcastAUDIOFOCUS_LOSS — o player deve parar
AUDIOFOCUS_GAIN_TRANSIENTChamada, notificação de vozAUDIOFOCUS_LOSS_TRANSIENT — pausa
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCKInstrução GPS, sinal curtoAUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — reduzir volume
AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVEPesquisa por voz, gravaçãoAUDIOFOCUS_LOSS — parada completa

Particularidades do AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK

Duck é uma redução temporária do volume do player principal para 20–30% enquanto um som secundário toca. O Android fornece uma API para duck manual via AudioManager.adjustSuggestedStreamVolume, mas a maioria dos players implementa a redução por meios próprios. De acordo com a Documentação do Android (2026), o tratamento de duck deve durar no máximo 3 segundos, após os quais o volume é restaurado.

Implementação do Audio Focus em código

Para implementar corretamente o Audio Focus, você precisa realizar três etapas sequencialmente: criar uma solicitação, solicitar o foco antes da reprodução e lidar com o evento em um callback. O uso de AudioFocusRequestCompat do AndroidX media garante compatibilidade com todas as versões do Android.

Criação e execução de uma solicitação de Audio Focus

kotlin
val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager

val focusRequest = AudioFocusRequestCompat.Builder()
    .setFocusGain(AudioManagerCompat.AUDIOFOCUS_GAIN)
    .setOnAudioFocusChangeListener(focusChangeListener)
    .build()

val result = AudioManagerCompat.requestAudioFocus(audioManager, focusRequest)

if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
    startPlayback()
}

A solicitação de foco deve ser feita antes de iniciar a reprodução cada vez que o usuário pressiona Play. Se o resultado for AUDIOFOCUS_REQUEST_GRANTED — comece a tocar. Se for DENIED — mostre uma mensagem ao usuário ou adie a reprodução até obter o foco.

Callback de mudança de foco

kotlin
private val focusChangeListener = AudioManager.OnAudioFocusChangeListener { focusChange ->
    when (focusChange) {
        AudioManager.AUDIOFOCUS_GAIN -> {
            restoreVolume()
            if (wasPlayingBeforeLoss) resumePlayback()
        }
        AudioManager.AUDIOFOCUS_LOSS -> {
            pausePlayback()
            wasPlayingBeforeLoss = false
        }
        AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> {
            pausePlayback()
            wasPlayingBeforeLoss = true
        }
        AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {
            duckVolume()
        }
    }
}

No callback, é importante distinguir entre AUDIOFOCUS_LOSS e AUDIOFOCUS_LOSS_TRANSIENT. No primeiro caso, o player NÃO deve retomar automaticamente — o usuário iniciou explicitamente outro áudio. No segundo, pode retomar automaticamente ao receber AUDIOFOCUS_GAIN. O flag wasPlayingBeforeLoss ajuda a lembrar se a reprodução precisa ser restaurada.

Liberação do Audio Focus

kotlin
private fun abandonAudioFocus() {
    AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}

Chamar abandonAudioFocusRequest informa ao sistema que o app não precisa mais do foco. É importante chamá-lo ao pausar e parar o player. Se o foco não for liberado, outro app solicitando AUDIOFOCUS_GAIN não receberá LOSS e os sons se sobreporão.

Lidando com a perda do foco de áudio

Lidar corretamente com a perda de foco é um requisito fundamental para passar pela revisão do Google Play. O tratamento incorreto leva a avaliações negativas: os usuários reclamam que a música continua tocando durante uma chamada ou sobre a navegação.

Ao receber AUDIOFOCUS_LOSS, o player deve parar e não retomar até que o usuário pressione Play explicitamente. Em AUDIOFOCUS_LOSS_TRANSIENT (chamada, notificação), o player pausa e retoma automaticamente quando o foco é restaurado. Em AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK, o player reduz temporariamente o volume para 20–30% enquanto o áudio externo é reproduzido.

De acordo com o Guia do Desenvolvedor Android (2026), o duck deve ser implementado multiplicando o nível de volume atual do AudioTrack por um fator de 0.2–0.3. Não use AudioManager.setStreamVolume — isso altera o volume do sistema e afeta outros apps. O duck é realizado apenas no lado do próprio player.

Lidando com chamadas e navegação

Em uma chamada recebida, o sistema solicita automaticamente AUDIOFOCUS_GAIN_TRANSIENT através do app Telefone. O player recebe AUDIOFOCUS_LOSS_TRANSIENT e pausa. Após a chamada terminar ou se o usuário recusar a chamada, o foco retorna — o player retoma automaticamente a reprodução se for um player de música.

Para apps de navegação (Google Maps), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK é usado durante instruções de voz. O player tem seu volume reduzido por 2–3 segundos, depois o volume é restaurado. Se o usuário estiver ouvindo um podcast em vez de música, é melhor pausar do que reduzir o volume — cada segundo importa em podcasts.

Cenários típicos de uso

Na prática, os desenvolvedores encontram vários cenários padrão onde o Audio Focus se comporta de maneira diferente. Vejamos os casos típicos e as reações corretas.

  • Música + chamada — o player pausa (AUDIOFOCUS_LOSS_TRANSIENT). Após a chamada, retoma automaticamente se o usuário não interagiu com o player.
  • Música + navegação — o player tem seu volume reduzido durante a instrução de voz (DUCK). O volume é restaurado após a frase terminar.
  • Usuário iniciou outro app — o player recebe AUDIOFOCUS_LOSS e para. Retomada apenas pelo botão Play.
  • Vídeo + música em segundo plano — o player de vídeo solicita AUDIOFOCUS_GAIN. O player de música recebe LOSS e para.
  • Pesquisa por voz (Google Assistant) — o app recebe AUDIOFOCUS_LOSS_TRANSIENT, pausa e retoma automaticamente após a resposta do assistente.

Retomada automática após perda de foco

É importante implementar um flag que lembre se a música estava tocando antes da perda de foco. Se o usuário pressionou pausa por conta própria e depois chegou uma chamada — não retome. O flag é redefinido na pausa explícita do usuário e é definido ao iniciar a reprodução.

De acordo com a pesquisa de UX do Google (2024), a retomada automática após uma chamada aumenta a satisfação do usuário em 22%. Mas se o player retomar depois que o usuário já começou a assistir a um vídeo — isso causa irritação. O flag wasPlayingBeforeLoss evita retomadas falsas.

Perguntas Frequentes

O Audio Focus é obrigatório para todos os apps com áudio?

Sim, a partir do Android 12, o Google Play recomenda a implementação do Audio Focus para todos os apps que reproduzem áudio. Os apps da categoria Música e Áudio devem implementá-lo para publicação. Ignorá-lo pode levar à rejeição da atualização.

Como verificar se o Audio Focus está funcionando corretamente?

Inicie seu player, depois abra outro app de áudio (por exemplo, YouTube Music). Seu player deve pausar. Em seguida, feche o YouTube Music — o player deve retomar automaticamente. Para um teste de duck, use o Google Maps com instruções de voz.

O que é AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK na prática?

O sistema diz: “Outro app precisa reproduzir brevemente um som curto — reduza o volume do seu player.” Isso é ideal para instruções de voz e notificações curtas. O volume é restaurado após o áudio externo terminar sem intervenção manual.

Posso rejeitar uma solicitação de perda de Audio Focus?

Formalmente sim — o sistema não força. Mas na prática isso significa sobreposição de sons. O usuário ouvirá música e uma chamada simultaneamente, levando a uma experiência negativa. O Google recomenda sempre lidar com AUDIOFOCUS_LOSS parando o player.

O Audio Focus funciona em outras plataformas além do Android?

No iOS, o papel equivalente é desempenhado pelo Audio Session, gerenciado através do AVAudioSession. Os mecanismos são semelhantes: categorias e opções definem o comportamento durante a sobreposição de sons. No entanto, a API e as regras diferem significativamente — cada framework é implementado de sua própria maneira.

Resumo

  • Audio Focus é o árbitro de áudio do sistema no Android, que impede a sobreposição de sons entre diferentes apps.
  • A solicitação de foco é feita através de AudioFocusRequestCompat especificando durationHint: GAIN, TRANSIENT ou TRANSIENT_MAY_DUCK.
  • O callback OnAudioFocusChangeListener lida com quatro eventos: GAIN, LOSS, LOSS_TRANSIENT e LOSS_TRANSIENT_CAN_DUCK.
  • Em AUDIOFOCUS_LOSS o player para; em TRANSIENT — pausa com retomada automática; em DUCK — reduz o volume.
  • É importante rastrear o flag wasPlayingBeforeLoss para evitar retomar após uma pausa explícita do usuário.
  • A liberação do foco através de abandonAudioFocusRequest é obrigatória ao pausar e parar o player.
  • No iOS, o equivalente do Audio Focus é Audio Session (AVAudioSession) com suas próprias categorias e modos.

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também