Play mp3 files one after another with a slight delay with more elegant code?

I need to play several (correctly: 2) mp3 files downloaded from my assets, at the click of a button. If the button is pressed again, it is necessary to play 2 new songs, and the old ones must be stopped by immidiatelly.The process continues ... At the moment I have achieved this by stupidly creating 2 copies of mediaPlayer in two separate methods, which basically have the same body. The caller is the onTouch method, and in it I first call method 1, then sleep for 2 seconds, then the call method 2. I'm sure there must be more elegant code for this? For example, I introduced several listeners that just sit there (actually tried to do thiswork, but completely confused with illegal states everywhere). Ideally, I would like to use 1 MediaPlayer and one way to play every sound in my application.

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);
            }
        }
    }
}

Now my player methods 1 and 2 (playMusic1 () and playMusic2 ()) are the same. Both launch different MediaPlayers and for shaking simplicity I write only one copy in the message

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();
        }
    }
+4
source share
2 answers

For immediate playback, you need to install and copy MediaPlayer via OnCompletionListener

You can do it as follows:

Note that I also removed the unnecessary overrides, you can add them again if you need them.

    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();
        }
    }
}

To run both media planners in a row, simply Assets.playMusic("music1.ogg",false, "music2.ogg",false);

+1
source

- . . , , . , .

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();
}
+1

All Articles