Reproducir archivos mp3 uno tras otro con poco retraso con un código más elegante?

Necesito reproducir varios archivos MP3 (correctos: 2) cargados desde mis activos cuando se hace clic en un botón. Si el botón de nuevo se hace clic en 2 nuevas canciones deben ser jugadas y los antiguos deben ser detenidos immidiatelly.El proceso está en marcha … En el momento que he logrado esto por estúpidamente la creación de 2 instancias mediaPlayer en 2 métodos diferentes que básicamente tienen la el mismo cuerpo . El llamador es un método onTouch y, dentro de él, primero llamo a método 1, luego duerme durante 2 segundos, a continuación, llamar al método 2. Estoy seguro de que debe haber una manera para que este sea el código más elegante? Por ejemplo, he implementado algunos oyentes que están sentados allí (en realidad trató de hacer este trabajo, pero totalmente jodido con los estados ilegales en todo el lugar). Idealmente me gustaría usar 1 MediaPlayer y un método para reproducir cada sonido en mi aplicación.

int carouzelIndex = 0 @Override public boolean onTouch(MotionEvent e, int scaledX, int scaledY) { ... if (e.getAction() == MotionEvent.ACTION_UP) { carouzelIndex++; Assets.playMusic1("music1.ogg",false); Thread thread = new Thread(){ public void run(){ try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } Assets.playMusic2("music2.ogg",false); } } } } 

Ahora mis métodos de jugador 1 y 2 (playMusic1 () y playMusic2 ()) son los mismos. Ambos están instansiating diferentes MediaPlayers y para la sacudida de la simplicidad escribo apenas una copia en el poste

 Public class Assets MediaPlayer mediaPlayer; public static void playMusic(String filename, boolean looping) { AssetFileDescriptor afd = null; Log.d("Assets", "playing music"); if (mediaPlayer == null) { mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setLooping(looping); } try { if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setLooping(looping); } afd = GameMainActivity.assets.openFd(filename); mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); afd.close(); mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { if (!mp.isPlaying()) mp.start(); } }); mediaPlayer.setOnErrorListener(new OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { return false; } }); mediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { mediaPlayerIsFinished = true; mp.reset(); } }); mediaPlayer.setOnInfoListener(new OnInfoListener() { @Override public boolean onInfo(MediaPlayer mp, int what, int extra) { // TODO Auto-generated method stub return false; } }); } catch (Exception e) { e.printStackTrace(); } } 

Para la reproducción inmediata necesita dos MediaPlayer configurar y encadenados a través de OnCompletionListener

Puedes hacerlo así:

Tenga en cuenta que también he eliminado algunas anulaciones innecesarias, puede agregarlas de nuevo si las necesita.

  Public class Assets{ MediaPlayer mediaPlayer; MediaPlayer mediaPlayer2; boolean mediaplayer2prepared = false; boolean mediaplayer1finished = false; public static void playMusic(String filename, boolean looping, String filename2, boolean looping2) { AssetFileDescriptor afd = null; Log.d("Assets", "playing music"); if (mediaPlayer == null) { mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setLooping(looping); mediaplayer1finished = false; } if (mediaPlayer2 == null) { mediaPlayer2 = new MediaPlayer(); mediaPlayer2.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer2.setLooping(looping); mediaplayer2prepared = false; } try { if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setLooping(looping); mediaplayer1finished = false; } if (mediaPlayer2 != null) { mediaPlayer2.stop(); mediaPlayer2.release(); mediaPlayer2 = new MediaPlayer(); mediaplayer2prepared = false; mediaPlayer2.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer2.setLooping(looping); } afd = GameMainActivity.assets.openFd(filename); mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); afd.close(); mediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { if (!mp.isPlaying()) mp.start(); } }); mediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { mediaPlayerIsFinished = true; mp.reset(); if(mediaplayer2prepared) mediaplayer2.start(); mediaplayer1finished = true; } }); mediaPlayer.prepareAsync(); afd2 = GameMainActivity.assets.openFd(filename2); mediaPlayer2.setDataSource(afd2.getFileDescriptor(), afd2.getStartOffset(), afd2.getLength()); afd2.close(); mediaPlayer2.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mediaPlayerIsFinished = true; mp.reset(); mediaplayer2prepared = true; if(mediaplayer1finished && !mp.isPlaying()){ mp.start(); } } }); mediaPlayer2.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { mediaPlayerIsFinished = true; mp.reset(); } }); mediaPlayer2.prepareAsync(); } catch (Exception e) { e.printStackTrace(); } } } 

Para iniciar ambos mediaplayers en sucesión, simplemente haga Assets.playMusic("music1.ogg",false, "music2.ogg",false);

Puedes probar algo como esto. Utilice un único reproductor multimedia en un único subproceso. Es una operación asíncrona por lo que se continuará también si el hilo está en pausa. Pienso que puede funcionar.

 private Thread t = null; private MediaPlayer mediaPlayer; ... Button b=findViewById(R.id.yourButtonId); b.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ //if button had previously clicked stop audio reproduction if(mediaPlayer.isPlaying()) mediaPlayer.stop(); if(t.isAlive()) t.stop(); String[] files; //Here you have to set your filenames in the array ... ... //Now play that audio playMusic(files, false); } }); ... protected static void playMusic(String[] files, boolean looping){ AssetFileDescriptor afd = null; Log.e("Assets", "Playing music"); t=new Thread(){ @Override public void run(){ //Initialize mediaPlayer for(String filename:files){ mediaPlayer=new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setLooping(looping); afd = GameMainAcivity.assets.openFd(filename); mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(),afd.getLength()); afd.close(); mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(new OnPreparedListener(){ @Override public void onPrepared(MediaPlayer mp){ if(!mp.isPlaying()) mp.start(); } }); //while audio is playing wait in this position while(mediaPlayer.isPlaying()){ this.wait(100); } //now loop can restart with the other filename that has //to be reproduced } } }; t.start(); } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.