java Android 中使用 MediaPlayer 播放 mp3 文件列表
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/30681002/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Play list of mp3 file with MediaPlayer in Android
提问by Gualty
I have a problem to reproduce more than one mp3 file using MediaPlayer in Android. I'm able to reproduce one single file but I did not find nothing useful to reproduce different files one after the other.
我在 Android 中使用 MediaPlayer 重现多个 mp3 文件时遇到问题。我能够复制一个文件,但我没有发现一个接一个地复制不同的文件有什么用处。
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
谢谢
回答by Saptak Niyogi
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();
}
}
回答by Daniyal Javaid
May be the simplest solution is to implement 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.
可能是最简单的解决方案是实现setOnCompletionListener。每当您的音频完全播放时,就会调用此生命周期,您可以加载和播放下一个音频,因此当下一个音频完成时,将再次调用此生命周期,以此类推。
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();
}
}
}
});