MediaPlayer no Android, Entendendo e Utilizando

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes! Você receberá um email de confirmação. Somente depois de confirma-lo é que eu poderei lhe enviar os conteúdos semanais exclusivos. Os artigos em PDF são entregues somente para os inscritos na lista.

Email inválido.
Blog /Android /MediaPlayer no Android, Entendendo e Utilizando

MediaPlayer no Android, Entendendo e Utilizando

Vinícius Thiengo
(15446) (30)
Go-ahead
"O método consciente de tentativa e erro é mais bem-sucedido que o planejamento de um gênio isolado."
Peter Skillman
Prototipagem Android
Capa do curso Prototipagem Profissional de Aplicativos
TítuloAndroid: Prototipagem Profissional de Aplicativos
CategoriasAndroid, Design, Protótipo
AutorVinícius Thiengo
Vídeo aulas186
Tempo15 horas
ExercíciosSim
CertificadoSim
Acessar Curso
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Lendo
TítuloTest-Driven Development: Teste e Design no Mundo Real
CategoriaEngenharia de Software
Autor(es)Mauricio Aniche
EditoraCasa do Código
Edição1
Ano2012
Páginas194
Conteúdo Exclusivo
Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba gratuitamente conteúdos Android sem precedentes!
Email inválido

Opa! Blz?

Nesse vídeo dou inicio a série de vídeos sobre a classe MediaPlayer no Android, classe utilizada para rodar recursos de mídia. A principio vou focar no recurso áudio, pois já fiz alguns vídeos sobre VideoView que basicamente é a abordagem de mídia para vídeo no Android (não sendo a única).

É importante ficar ligado nos estados do objeto MediaPlayer, é tão importante que o Android faz questão de mostrar um diagrama dos estados, um tabela para informar em qual estado pode-se chamar determinado método, além de citar a importância desse entendimento em um tópico em uma página do próprio site do Android que apresenta uma imlementação do MediPlayer. Entendendo os métodos do ciclo de vida do MediPlayer é importante também saber quais são as formas nas quais podemos carregar o recurso que será apresentado no MediaPlayer (carregamento via Raw folder, Assets folder, servidor Web ou SDCard). E para finalizar o entendimento dos listener e dos métodos prepare() e prepareAsync() são de muita importância também, pois são com eles que você trabalha a inicialização e monitoramento do recurso a ser apresentado. Então é isso, fique atento que nem mostrei o prepare() rodando, pois o uso dele não é recomendado pelo Android, apenas em casos muito específicos. Também mostro uma jogada com as flags / variaveis "duration", "currentTime" e "isPlaying" para poder continuar com a música onde ela parou quando a APP sofre uma reconstrução de tela (mudança da orientação de tela é um exemplo de reconstrução). Sem mais delongas, vou deixar você assistir ao vídeo.

O link para download do projeto se encontra logo abaixo no post.

Segue links de outros posts que podem lhe dar um reforço para entender algumas das entidades apresentadas nesse vídeo e não comentadas mais afundo:

Entendendo a Thread Principal de Uma APP Android

runOnUiThread, Atalho de Acesso a Thread Principal no Android

Segue links das páginas apresentadas no vídeo:

Página da classe MediaPlayer no site oficial do Android

Página de uma implementação da classe MediaPlayer no site oficial do Androd

Página da classe AssetFileDescriptor no site oficial do Android

Vlw.

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes!
Email inválido

Relacionado

Compartilhamento com Facebook SDK no AndroidCompartilhamento com Facebook SDK no AndroidAndroid
Compartilhamento com Facebook ShareDialog no AndroidCompartilhamento com Facebook ShareDialog no AndroidAndroid
ContentProvider no Android, Entendendo e UtilizandoContentProvider no Android, Entendendo e UtilizandoAndroid
SharedPreferences no Android, Entendendo e UtilizandoSharedPreferences no Android, Entendendo e UtilizandoAndroid

Compartilhar

Comentários Facebook

Comentários Blog (30)

Para código / script, coloque entre [code] e [/code] para receber marcação especifica.
Forneça seu nome válido.
Forneça seu email válido.
Forneça o comentário.
Enviando, aguarde...
Carlos (1) (0)
27/12/2018
Então, estou criando o media player. Tudo funciona.
Agora gostaria de implementar o contador de progresso do carregamento do Streaming.

Vou postar meu código todo para você dar uma olhada.

Note abaixo que, mesmo implementando o OnBufferingUpdateListener na classe Player, o código abaixo não funciona:



    @Override
    public void onBufferingUpdate(MediaPlayer mediaPlayer, int percent) {
        progressBar.setProgress(percent);
    }

Onde estou errando?

Segue o código todo!

package carcleo.com.player;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.ProgressDialog;
import android.app.TaskStackBuilder;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.session.MediaSession;
import android.os.AsyncTask;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.RemoteViews;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;
import java.util.Locale;

public class player extends AppCompatActivity implements OnBufferingUpdateListener{

    private MediaPlayer mPlayer;
    private String URL;
    private Button btnPlayPause;
    private Boolean conexao = false;
    private ProgressDialog progressDialog;
    private SeekBar sb;
    private TextView textView;
    private NotificationManager mNotificationManager;
    private AudioManager audioManager;
    private ProgressBar progressBar;

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.player);
        sb = findViewById(R.id.seekBar);
        textView = findViewById(R.id.textView);

        progressDialog = new ProgressDialog(this);
        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        btnPlayPause = (Button) findViewById(R.id.btnPlayPause);

        btnPlayPause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    if (mPlayer == null) mPlayer = new MediaPlayer();
                    tocaPausa();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
configuraAudioManager();

    }

    private void tocaPausa() throws IOException {
        if (conexao == true) {
            btnPlayPause.setBackgroundResource(R.drawable.carregando);
            if (!mPlayer.isPlaying()) {
                mPlayer.start();
                btnPlayPause.setBackgroundResource(R.drawable.pause);
            } else {
                mPlayer.pause();
                btnPlayPause.setBackgroundResource(R.drawable.play);
            }
        } else {
            String url = "rtsp://cdn-the-2.musicradio.com:80/LiveAudio/Capital"; // your URL here
            new Play().execute(url);
        }
    }

    @Override
    public void onBufferingUpdate(MediaPlayer mediaPlayer, int percent) {
        progressBar.setProgress(percent);
    }

    private void configuraAudioManager() {
        audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

        int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        int volume    = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

        sb.setMax(maxVolume);
        sb.setProgress(volume);

        sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, AudioManager.FLAG_SHOW_UI);

                Double total = progress * 6.666666666666667;
                String valor =Integer.toString(Integer.valueOf(total.intValue()));
                textView.setText(valor+" %");

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {}

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {}
        });
    }

    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    private void notificacao (){

        RemoteViews remoteViews = new RemoteViews(this.getPackageName(), R.layout.player);

        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(this)
                        .setSmallIcon(R.drawable.home)
                        .setContentTitle("Rádio Capital")
                        //.setCustomContentView(remoteViews)
                        .setContentText("Agora deu");

        Intent resultIntent = new Intent(this, player.class);
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addParentStack(player.class);
        stackBuilder.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setContentIntent(resultPendingIntent);
        mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(1, mBuilder.build());

    }

    class Play extends AsyncTask<String, Boolean, Boolean> {

        @Override
        protected void onPreExecute() {

            btnPlayPause.setBackgroundResource(R.drawable.carregando);
            btnPlayPause.setEnabled(false);
            progressDialog.setMessage("Carregando...");
            //progressDialog.show();

        }

        @Override
        protected Boolean doInBackground(String... params) {

            try {
                mPlayer = new MediaPlayer();
                mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                mPlayer.setDataSource(params[0]);

                /*
                mPlayer.setOnBufferingUpdateListener(
                        (mediaPlayer, percent) ->
                                textView.setText(String.format(Locale.getDefault(), "Buffered to %d%%", percent)));
                )
                */

                mPlayer.prepare(); // might take long! (for buffering, etc)
                return true;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }

        }

        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
        @Override
        protected void onPostExecute(Boolean result) {

            if (progressDialog.isShowing()) {
                progressDialog.cancel();
            }

            if(result == true){
                conexao = true;
                mPlayer.start();
                btnPlayPause.setBackgroundResource(R.drawable.pause);
            } else {
                conexao = false;
                btnPlayPause.setBackgroundResource(R.drawable.play);
            }

            btnPlayPause.setEnabled(true);

            notificacao();

        }

    }

}
Responder
Vinícius Thiengo (0) (0)
09/01/2019
Carlos, tudo bem?

Aparentemente você está reutilizando esse código de Buffer de algum outro projeto, certo?

Em doInBackground() o trecho de código que mostra o buffer em tela, via TextView, está comentado.

Descomente o trecho a seguir:

mPlayer.setOnBufferingUpdateListener(
        (mediaPlayer, percent) ->
                textView.setText(String.format(Locale.getDefault(), "Buffered to %d%%", percent)));
)

Provavelmente assim o código buffer passará a funcionar.

Abraço.
Responder
Carlos (1) (0)
10/01/2019
Então, esse é que o problema. Está comentado poia fui fazendo várias tentativas e à medida que não foram dando certo, ia comentando para não interferir nas outras tentativas entende?
Essa também não funcionou.
Estou bufferizando Rádio Web, uma emissora de fm que transmite seu sinal pela web. No caso, NÃO são músicas que podemos escolher entre a primeira e segunda e buffereizar.
O problema aqui é que quando clico pela primeira vez (e apenas na primeira vez) em "Tocar" o MediaPlayer começa o processo de buffer do som até que toque pela primeira vez. É justamente esse tempo que pretendo contar.
Responder
Vinícius Thiengo (0) (0)
08/04/2019
Carlos,

Em seu código há um listener para quando o buffer finaliza o carregamento? Finaliza e está pronto para tocar a rádio.

Se sim, você pode criar um temporizador na tela que carrega até os 90% assim que o usuário der o touch em "Tocar", por exemplo, e ao final, com o listener de fim de carregamento acionado, leva o temporizador aos 100%.

É um paliativo caso você ainda não tenha em mãos o listener de porcentagem carregada, porcentagem exata.

Abraço.
Responder
Vinícius Jales de Souza (1) (0)
24/01/2018
Ótimo vídeo xará, então eu sou ainda iniciante em android studio e estou tentando criar uma função básica que é assim que o meu app abrir ele faz o buffer carregando e já executa a Url e o botão que apareça apos o buffer (CARREGANDO...) já aparecer o botão PAUSE não sei como fazer isso, estou apenas com esse detalhe pra finalizar o meu projeto:
package conciso.radioweb156natal;

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    Button b_play;
    MediaPlayer mediaPlayer;

    boolean prepared = false;
    boolean started = false;

    String url = "http://radio.imd.ufrn.br/156natal ";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        b_play = (Button) findViewById(R.id.b_play);
        b_play.setEnabled(false);
        b_play.setText("CONECTANDO...");


        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

        new PlayerTask().execute(url);


        b_play.setOnClickListener (new View.OnClickListener(){
            @Override
            public void onClick (View view) {
                if(started){
                    started = false;
                    mediaPlayer.pause();
                    b_play.setText("PLAY");
                } else {
                    started = true;
                    mediaPlayer.start();
                    b_play.setText("PAUSE");
                }
            }

        });
    }

    class PlayerTask extends AsyncTask<String, Void, Boolean> {
        @Override
        protected Boolean doInBackground(String... strings) {

            try {
                mediaPlayer.setDataSource(strings[0]);
                mediaPlayer.prepare();
                prepared = true;
            } catch (IOException e) {
                e.printStackTrace();
            }

            return prepared;
        }

        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);
            b_play.setEnabled(true);
            b_play.setText("PLAY");
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if(started){
            mediaPlayer.pause();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if(started){
            mediaPlayer.start();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(prepared){
            mediaPlayer.release();
        }
    }
  public void clickexit(View v)
  {
    moveTaskToBack(true);
    android.os.Process.killProcess(android.os.Process.myPid());
    System.exit(1);

    }
}
Responder
Vinícius Thiengo (0) (0)
26/01/2018
Vinícius, tudo bem?

Utilize no objeto MediaPlayer o listener OnPreparedListener. Vejo o roteiro a seguir:

-> Crie uma classe que implemente a Interface MediaPlayer.OnPreparedListener. Pode ser uma classe interna como já está fazendo com a classe PlayerTask;

-> Na nova classe, mais precisamente no método onPrepared(), coloque o código que esconderá o TextView "Carregando..." e apresentará o Button "Play", isso tudo utilizando o método setVisibility() das duas entidades, Button e TextView;

-> Como estado padrão do aplicativo, inicie a tela com o TextView "Carregando..." visivível: android:visibility="visible";

-> Assim que o objeto MediaPlayer for iniciado no onCreate() da atividade, vincule a ele um objeto do tipo da classe criada no primeiro passo, que implemente a Interface OnPreparedListener. Vincule-os pelo método setOnPreparedListener();

Vinícius, dessa forma você conseguirá o comportamento esperado. Não esqueça de já deixar o Button "Play" na tela, porém escondido: android:visibility="gone".

Note também que terá de colocar o listener de clique no Button "Play", mais precisamente o listener OnClickListener como no código de exemplo do link a seguir: https://stackoverflow.com/a/16636877/2578331

No método onClick() do listener, coloque o código que dá o play no MediaPlayer: mediaPlayer.start().

Mais sobre listeners e implementação do MediaPlayer, entre nos links a seguir:

-> https://developer.android.com/reference/android/media/MediaPlayer.html

-> https://developer.android.com/guide/topics/media/mediaplayer.html

Abraço.
Responder
13/11/2017
Olá Thiengo, muito bom o video, vlw.

O media player demora muito para carregar o audio de streaming ao vivo. Tem alguma forma de começar a executar o audio imediatamente e ir fazendo o buffer... Tem algum material sobre o ExoPlayer?
Responder
Vinícius Thiengo (0) (0)
14/11/2017
Romário, tudo bem?

Pretendo ainda construir um conteúdo sobre o ExoPlayer, mas enquanto isso vou lhe indicar alguns outros que podem lhe auxiliar com este problema de audio streaming, segue:

- Implement Audio Streaming in Android Applications: https://android.jlelse.eu/implement-audio-streaming-in-android-applications-8758d3bc62f1

- Várias APIs de audio, incluindo algumas que permitem o streaming: https://android-arsenal.com/tag/8?sort=rating

Romário, se possível, depois informe se algo lhe serviu, pois assim será possível facilmente indicar a solução a outros desenvolvedores.

Abraço.
Responder
Lígia Marsoni (1) (0)
09/04/2017
Olá Thiengo, tudo bem?

Agradeço pela sua ajuda.

Novamente estou entrando em contato com você para me ajudar no meu código de áudio. A minha ideia era colocar 2 audios em meu aplicativo, quando tocasse um audio, iria iniciar o audio de fundo, mas resolvi inserir apenas o áudio de fundo e utilizando o mesmo codigo que estava já em meu aplicativo.

O problema é que quando o aplicativo é encerrado/fechado, o áudio de fundo continua tocando, o código é o mesmo que havia passado pra você aqui mesmo no seu site. Pode me ajudar nisso? :-)

O código é esse:


@Override
public void onResume() {
super.onResume();
        if (mPlayer == null) {
        mPlayer = MediaPlayer.create(this, R.raw.fundo);
        }
mPlayer.start();
}

@Override
public void onPause() {
super.onPause();
        if (mPlayer != null) {
        mPlayer.stop();
        }
}

@Override
    protected void onDestroy() {
        super.onDestroy();
        if (mPlayer != null) {
        mPlayer.release();
        mPlayer = null;

        }
    }
Responder
Vinícius Thiengo (0) (0)
13/04/2017
Lígia, tudo bem?

A princípio o código está correto.

Faça o seguinte, adicione um Log dentro e fora dos condicionais para saber se os métodos onPause() e onDestroy() estão sendo invocados e se os condicionais estão tendo os algoritmos internos executados.

Caso ainda não tenha trabalhado com Log no Android, veja o conteúdo a seguir: http://www.thiengo.com.br/entendendo-e-utilizando-o-a-classe-log-com-o-logcat-no-android

Se depois de seus testes não conseguir construir uma solução, volte aqui com os resultados e o código completo desta Activity. Abraço.
Responder
Mayckon (1) (0)
06/04/2017
Olá Vinícius, tudo certo?
Cara, bem bacana esse teu vídeo, dele consegui tirar umas ideias, mas ainda assim não sei como finalizar meu aplicativo, vamos ver se podes me dar um toque. Eu sou novato no ramo, então pode ser que eu não saiba alguns termos.

Quando eu clico no blackground do meu app ele emite um som de uns 3 seg, se um segundo depois eu clicar novamente no background ele não tem ação nenhuma, mas se acaba o som e eu clico de novo no background ele toca. O que eu quero é que ao clicar no background ele toque o som e vá colocando um em cima do outro cada vez que eu clicar.

Eu cheguei a isso, porém fica travando o som e depois de alguns minutos o aplicativo fecha.


Código do layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android "
xmlns:app="http://schemas.android.com/apk/res-auto "
xmlns:tools="http://schemas.android.com/tools "
android:id="@+id/arma"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
android:weightSum="1"
android:onClick="acao">[java][/java]

codigo da activity dentro do oncreate:

contartoque = 10;
MP1 = MediaPlayer.create(this, R.raw.som);

public void acao (View view){
if (contartoque >=1){
MP1 = MediaPlayer.create(this, R.raw.som);
MP1.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
@Override
public void onCompletion(MediaPlayer mp) {
if(MP1 != null) {
MP1.release();
MP1 = null;
}
}
});
MP1. start();
}
}

Dessa forma eu consigo clicar várias vezes seguidas no background e ele emite um som por cima do outro, mas fica travando o som e depois de um tempo fecha o aplicativo.
Se puder me ajudar te agradeço, não sei o que estou fazendo de errado e nem como consertar ou fazer da forma correta.
Desde já agradeço
Abraço
Responder
Vinícius Thiengo (0) (0)
08/04/2017
Mayckon, tudo bem?

Faça o seguinte, ao invés de criar um novo objeto para tocar o som todas as vezes que há um toque no background, crie somente um objeto MediaPlayer e nele trabalhe os métodos start() e stop().

O que provavelmente está acontecendo é que está sendo criado vários objetos MediaPlayer e assim está ocorrendo vazamento de memória até um OutOfMemoryException ser gerada.

Algo importante quando estiver com algum problema: envie o texto explicando o domínio onde o problema ocorre e também envie a pilha de erro apresentada nos logs dos Android Studio, assim quem estiver para lhe ajudar poderá ir direto a linha de código problemática.

De qualquer forma, tente essa mudança na lógica de negócio de seu sistema. Utilize apenas um objeto MediaPlayer e trabalhe com os método start() e stop(). Assim deve funcionar sem problemas. Abraço.
Responder
Nicolas (1) (0)
02/04/2017
Blz Thiengo?

Sou novo no mundo de criar app android, peguei uma apostila na internet que contém alguns projetos, dentre eles, criei um que segui passo a passo o que estava na apostila. Esse projeto funcionou perfeitamente, mas não estou conseguindo realizar uma modificação nele.

Nesse projeto, para iniciar uma animação, tem que clicar em menu e clicar em play para iniciar a animação e pause para pausar a animação. O que quero fazer e não estou conseguindo, é que quando o aplicativo for iniciado, a animação seja executada automaticamente, sem a necessidade do botão play e pause.

Tem como me ajudar nessa modificação, de iniciar automaticamente a animação quando o app for iniciado?

Esse é o código java que escrevi no eclipse, seguindo a apostila:


private AnimationDrawable flor;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ImageView florImage = new ImageView(this);
florImage.setBackgroundResource(R.drawable.brotando);
flor = (AnimationDrawable) florImage.getBackground();
setContentView(florImage);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}

public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.iniciar: flor.start(); return true;
case R.id.pausar: flor.stop(); return true;
}
return false;
}
}

Agradeço pela atenção
Responder
Vinícius Thiengo (0) (0)
08/04/2017
Nicolas, tudo bem?

Depois do método onCreate() adicione o seguinte método:

@Override
protected void onResume(){
        super.onResume();
        flor.start();
}

Assim deve funcionar sem problemas, digo, a animação se inicia assim que o aplicativo é aberto. Abraço.
Responder
Ligia Marsoni (1) (0)
27/03/2017
Olá Vinicius, tudo bem?

Ótimo vídeo! Parabens!

Estou criando um aplicativo, mas estou tendo dificuldades em adicionar o arquvo de áudio, você pode me ajudar nesse meu problema?

É o seguinte, a minha ideia é inserir 2 áudios na mesma activity (um toca e para e o outro deve tocar e permanecer com loop infinito). O primeiro já consegui, que é tocar e parar, mas estou tendo problemas de ativar o segundo áudio, que começaria a tocar depois que o primeiro áudio para de tocar.

O segundo áudio seria uma espécie de música e fundo, mas não estou conseguindo realizar essa função!

O código que estou utilizando é esse, que funciona perfeito para o primeiro áudio quando inicia a activity:

private MediaPlayer mPlayer;

@Override
public void onResume() {
super.onResume();
        if (mPlayer == null) {
        mPlayer = MediaPlayer.create(this, R.raw.intro);
        }
mPlayer.start();
}

@Override
public void onPause() {
super.onPause();
        if (mPlayer != null) {
        mPlayer.stop();
        }
}

@Override
    protected void onDestroy() {
        super.onDestroy();
        if (mPlayer != null) {
        mPlayer.release();
        mPlayer = null;
        }
    }
}


Mas não estou conseguido com que o segundo áudio (fundo) inicie e que não pare de tocar (loop infinito).

Pode me dar uma sugestão de como posso resolver isso?

Adoro os seus vídeos!!!
Responder
Vinícius Thiengo (0) (0)
01/04/2017
Ligia, tudo bem aqui.

Trabalhe com um Service.

Para o segundo áudio, assim que o primeiro finalizar (você consegue saber disso via listener do MediaPlayer) inicie um Service que terá como função executar o segundo áudio.

Mas deixe o código de remoção do Service logo no onDestroy() da atividade a qual ele foi iniciado, assim você não corre o risco de deixar o áudio tocando mesmo quando o usuário já saiu do aplicativo.

Caso não conheça o Service, dê uma olhada nos artigos / vídeos dos links abaixo, todos aqui do Blog:

http://www.thiengo.com.br/service-android-entendendo-e-utilizando
http://www.thiengo.com.br/intentservice-no-android-entendendo-e-utilizando

Abraço.
Responder
Mateus (1) (0)
29/10/2016
Thiengo, Aprendi a colocar URL´s de rádios no aplicativo para tocar, agora tenho uma dúvida, como pego o nome da música e do autor que está tocando para mostrar na tela? qual metodo devo utilizar?
Responder
Vinícius Thiengo (0) (0)
01/11/2016
Mateus, tudo bem?

A maneira comum de obter esses metadados é como explica nesse artigo / vídeo: http://www.thiengo.com.br/metadados-com-mediametadataretriever-no-android

Mas algumas rádios / músicas não têm esses metadados completos (alguns, nenhum metadado), nesse caso, se a rádio for sua e não souber adicionar esse dados, trabalhe com o envio de informação por meio de push message.

Porém será um trabalho um pouco manual caso não crie um script em seu backend que consiga automatizar todo o processo de envio de dados da música atual tocando.

Se a princípio quiser controlar todos os metadados na mão, o OneSignal pode lhe ajudar com isso. Veja esse artigo / vídeo que tenho sobre ele: http://www.thiengo.com.br/onesignal-para-notificacoes-em-massa-no-android

Caso queira algo mais sofisticado, em seu backend, com tudo automatizado, estude o Firebase Cloud Messaging (FCM) Third-party Server: https://firebase.google.com/docs/cloud-messaging/android/send-multiple

Abraço.
Responder
Alexandre Ferreira (2) (0)
10/08/2015
Boa tarde Thiengo, meu problemas agora e com a streaming estou utilizando este caminho, so que o mesmo nao executa, tentei fazer o download de seu projeto e mudar apenas a url por essa http://streaming13.hstbr.net:8122/live; mais nao funcionou. Essa url so faz o download do arquivo. Poderia me auxiliar nesta questao, e essa url mesmo que tenho que utilizar.
Responder
Vinícius Thiengo (0) (1)
11/08/2015
Fala Alexandre, blz?
O servidor da url streaming13.hstbr.net:8122/live tem de fornecer o conteúdo em streaming. Essa url rodou em algum outro lugar? Veja se não tem a versão em streaming com conteúdo em mp3. Abraço
Responder
Alexandre Ferreira (1) (0)
13/04/2015
Thiengo tudo bom, estou com o mesmo problema que o Ami Aram, só que não entendi muito o conteudo de service.
Tenho que executar todo o processo do botao play e do stop dentro do meu service ??
Outra coisa estou utilizando notificacao, quando o app esta executando deixei a notificacao, so que quando clico na notificacao ele não recupera a instancia, volta apenas para a tela que inicial, ai fica duas atividades em aberto, so que apenas uma executando a streaming, poderia dar uma ajuda para recuperar a instancia no momento em que clicar na notificacao ??

Desde já agradeco
Responder
Vinícius Thiengo (0) (0)
13/04/2015
Fala Alexandre, blz?
Tem um tempo que não trabalho com MediaPlayer e Service, mas se não me engano seus controles Play e Stop não precisam ficar somente no Service, pois na verdade o Service vai obter essa instancia do MediPlayer da Activity / Fragment para permitir ele continue tocando mesmo quando a APP já foi fechada.

Quanto a recuperação da instancia, estou assumindo que a instancia do MediaPlayer que está falando sobre, nesse caso vc pode utilizar ou o bindService do Service (esse provavelmente é o mais comum), ou o ResultReceiver (esse não vi ainda uma utilização com o MediaPlayer), ou o EventBus que pode ser a maneira mais simples de obter essa instancia novamente. Testou com todas essas maneiras? Veja se com alguma delas permanece com a mesma instancia.

Outra coisa que pode ser é que quando vc abre sua Activity principal ativada pela notification vc esteja no código da Activity ativando um novo MediaPlayer antes mesmo de verificar se já não tem uma instancia rodando no Service. Verifique se não é isso tb. Abraço
Responder
07/10/2014
Olá, ótima vídeo aula parabéns, gostaria de saber como criar um lista de reprodução com as musicas do SDcard. por exemplo um filtro automático de musicas .mp3 quegera um lista e eu posso executá-la.
Responder
Vinícius Thiengo (0) (0)
07/10/2014
Fala Herberth, blz?
Bom, vc quer saber como construir uma APP completa... manja já de Android ou está começando? Há várias maneiras de fazer isso, uma maneira que vejo é vc via Intent pegar todo o conteúdo do SDCard que tenha extensão .mp3 e então carregar para sua APP, filtro automático não ficou muito claro (imagino que o usuário deva escolher ao menos uma categoria ou gênero de música), mas enfim, com o usuário fazendo uma escolha de categoria vc via código (já com os metadados das músicas lidos) monta a lista de acordo com a opção escolhida. A parte que acho que vc terá maior dificuldade é para montar a interface que apresenta as músicas e seus respectivos metadados (nome, album, ...). A principio, colocar o MediaPlayer para rodar em um service pode parecer dificil, mas acrdito que não, é mais decorar do que quebrar a cabeça com lógica. Fique atento tb que algumas musicas não tem metadados. Abraço
Responder
08/10/2014
Sim, eu já sei um pouco de android, minha intenção e a de  não passar nenhuma musica por código, apenas o caminho do SDCard, o APP deve gerar uma lista com todas essas musicas, depois eu as organizo por gênero, ano...
Responder
Vinícius Thiengo (0) (0)
09/10/2014
Ok, então pode descartar a parte do MediaPlayer. Vc pode utilizar um DragDrop para permitir que o usuário arraste a música para a classificação certa, ou deixar tags de classificação para serem vinculadas as músicas, assim dá para ter mais de uma categoria / gênero... Abraço
Responder
Alexandre Ferreira (0) (0)
02/07/2014
Boa tarde, Fiz o exemplo dado so que coloquei a streaming de uma radio que peguei, só que quando instalo em meu celular, o mesmo não  carrega o audio, quando instalo pelo apk em outro aparelho ele funciona. Será alguma configuração do aparelho ou a internet, pois os testes feitos com os dois aparelhos foi no mesmo lugar e um funciona e o outro não carrega. Se puder ajudar agradeço.
Responder
Vinícius Thiengo (0) (0)
02/07/2014
Fala Alexandre, blz?
Puts, vc rodou uma rádio! Me passe o link da rádio se possível para q eu possa realizar os testes aqui tb... vai ser mt bom se a rádio passar de boa... estou curioso tb agora. Abraço
Responder
Alexandre (0) (0)
04/07/2014
Bom dia Vinicius, então como havia lhe digo, ele funciona em alguns aparelhos em outros não a minha streaming e a seguinte http://streaming12.hstbr.net:8112/live , se puder ajudar agradeço.
Responder
Vinícius Thiengo (1) (0)
04/07/2014
Blz Alexandre, vou dar uma olhada para ver o q pode ser. Abraço
Responder