Vamos fazer um aplicativo de música com o ExoPlayer. Nunca foi tão fácil?

Mohamed Hamdy em AndroidPub Seguir 29 de janeiro · 4 min ler fis.org

Em um mundo perfeito, você apenas abriria seu laptop e diria ao estúdio Android para torná-lo um aplicativo de reprodução de música totalmente funcional e ele apenas o faria, mas Nah, não é esse o caso aqui, então vamos descobrir como funciona.

Experimente o jogador

Em um outro mundo perfeito você apenas extrairia seu arquivo de áudio e o colocaria no player e diria ao jogador para começar e quando você deixar a atividade o jogador simplesmente desaparecerá, mas na maioria das vezes isso não é o caso, mas vamos começar com este caso apenas para entender como esse player funciona.

Vamos começar com dependências:

 android { 
compileSdkVersion 28
...
compileOptions {
sourceCompatibility JavaVersion.
VERSION_1_8

targetCompatibility JavaVersion. VERSION_1_8

}
}
dependências {
implementação 'com.google.android.exoplayer: exoplayer: 2.9.4'
}

Ok, agora precisamos adicionar algum arquivo de áudio para reproduzi-lo, adicionei um no recurso chamado heart_attack.mp3

O jogador prepara um MediaSource e joga quando você define player.playWhenReady como true, o que significa que você pode pausar a configuração player.playWhenReady para false ?:

Vamos jogar:

Agora, quando você executa o aplicativo, ele funciona muito bem ? e você não precisa lidar com nenhuma porcaria do Audio Focus ?

OK, é bem fácil até agora, mas o tocador de música deve usar um serviço para que possamos tocá-lo em segundo plano mesmo com essa atividade destruída, aperte o botão "voltar" e você ainda ouvirá a música porque nós não lançamos a música jogador, mas o problema é quando você abre o aplicativo novamente a música começa desde o início, na verdade, existem toneladas de problemas com o leitor de música em execução na atividade, então precisamos fazer mais trabalho ? pegar o seu café ?.

Arquitetura de aplicativos de mídia

Você é um desenvolvedor, então você sabe que arquitetura ruim é um pesadelo, talvez pior.

Guia do desenvolvedor da visão geral da arquitetura do aplicativo de mídia

Você pode ler isso aqui , mas aqui vou falar sobre como eu vejo isso.

Você tem dois lados, um é a interface do usuário de onde você envia seus eventos como iniciar, parar, pausar, etc. e o outro é o serviço rodando o player onde você responde a esses eventos, você também tem um “Browser” em o meio que “conecta” os eventos da UI às respostas do serviço.

Os eventos da interface do usuário são manipulados usando o MediaController, e adicionar o Compat para compatibilidade com APIs abaixo de 21 e como o guia diz que é a melhor prática, então é MediaControllerCompat , nessa classe você encontrará getTransportControls () que retorna o objeto TransportControls que você usa para parar (), play (), pausa () etc.

As respostas do serviço são tratadas usando MediaSessionCompat .Callback, onde você pode encontrar onPlay (), onStop (), onPause (), etc., pois o nome indica que o TransportControls # stop () dispara Callback # onStop e assim por diante.

Vamos entrar no código.

Criando MediaBrowserServiceCompat

Nosso serviço deve estender o MediaBrowserServiceCompat .

Criando MediaSessionCompat

Bem, o código explica a si mesmo ?

Criando MediaControllerCompat

Mais uma vez, entender que o código é bem simples, dê uma chance.