简体   繁体   English

在Android中使用MediaPlayer播放mp3文件列表

[英]Play list of mp3 file with MediaPlayer in Android

I have a problem to reproduce more than one mp3 file using MediaPlayer in Android. 我在使用Android中的MediaPlayer重现多个mp3文件时遇到问题。 I'm able to reproduce one single file but I did not find nothing useful to reproduce different files one after the other. 我能够重现一个单独的文件,但我没有发现一个接一个地重现不同文件没什么用处。

The code that now I use to reproduce one file is: 现在我用来重现一个文件的代码是:

public MediaPlayer mediaPlayer = null;

public void playP(View view) {

    if (mediaPlayer == null) {
        mediaPlayer = MediaPlayer.create(MainActivity.this, R.raw.music);
    }
    mediaPlayer.start();

}

How can I modify it to reproduce more a list of file? 如何修改它以重现更多的文件列表?

Thanks 谢谢

Create a list of the music that you want to include in playlist. 创建要包含在播放列表中的音乐列表。 Then keep track of the music that is playing and once finished start the next in the list. 然后跟踪正在播放的音乐,一旦完成,就开始列表中的下一个音乐。

Like this 像这样

import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;

import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;


public class MainActivity extends AppCompatActivity {

    Timer timer;
    MediaPlayer mp;
    ArrayList<Integer> playlist;
    int i=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        playlist = new ArrayList<>();
        playlist.add(R.raw.a1);
        playlist.add(R.raw.a2);
        mp = MediaPlayer.create(this,playlist.get(0));
        mp.start();
        timer = new Timer();
        if (playlist.size()>1) playNext();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void playNext() {
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                mp.reset();
                mp = MediaPlayer.create(MainActivity.this,playlist.get(++i));
                mp.start();
                if (playlist.size() > i+1) {
                    playNext();
                }
            }
        },mp.getDuration()+100);
    }

    @Override
    public void onDestroy() {
        if (mp.isPlaying())
            mp.stop();
        timer.cancel();
        super.onDestroy();
    }
}

May be the simplest solution is to implement setOnCompletionListener . 可能最简单的解决方案是实现setOnCompletionListener Whenever your audio is completely played , this lifecycle is called and you can load and play next audio, so when the next audio is finished this lifecycle is called again, and on and on. 无论何时完全播放音频,都会调用此生命周期,您可以加载并播放下一个音频,因此在下一个音频完成后,将再次调用此生命周期,然后再打开。

player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                 AssetFileDescriptor afd = null;
                if (fileCounter == playlist.size() - 1) {
                    //for reloading playlist
                    fileCounter = 0;
                }
                if (fileCounter < playlist.size() - 1) {
                    try {
                        afd = getContext().getAssets().openFd("Audios/" + playlist.get(++fileCounter).getName() + ".mp3");
                        player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                        player.prepare();
                        player.start();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }
        });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM