[英]Android Media player OncompletionListener Play Next song but not the second song
[英]Android Media Player stops after second song
我正在制作一個音樂播放器應用程序,但我遇到了問題。 播放完一首歌曲后,下一首歌曲開始播放,但當第二首歌曲播放完畢時,它會凍結並且什么也不做。 它曾經在日志上說媒體播放器因未處理的事件而消失,但我找到了另一種使用 Player.this.runOnUiThread 處理它的方法,現在它沒有這么說,但仍然不起作用。 有代碼:
String sname;
public static final String EXTRA_NAME = "song_name";
static MediaPlayer mediaPlayer;
int position;
ArrayList<File> mySongs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player);
if(mediaPlayer != null){
mediaPlayer.stop();
mediaPlayer.release();
}
Intent i = getIntent();
Bundle bundle = i.getExtras();
mySongs = (ArrayList) bundle.getParcelableArrayList("songs");
String songName = i.getStringExtra("songName");
position = bundle.getInt("pos", 0);
txtsname.setSelected(true);
Uri uri = Uri.parse(mySongs.get(position).toString());
sname = mySongs.get(position).getName();
txtsname.setText(sname);
setAlbumCover();
mediaPlayer = MediaPlayer.create(getApplicationContext(), uri);
mediaPlayer.start();
Player.this.runOnUiThread(new Runnable() {
@Override
public void run() {
if(mediaPlayer != null){
int currentPosition = mediaPlayer.getCurrentPosition();
seekMusic.setProgress(currentPosition);
}
}
});
seekMusic.setMax(mediaPlayer.getDuration());
seekMusic.getProgressDrawable().setColorFilter(getResources().getColor(R.color.colorPrimary), PorterDuff.Mode.MULTIPLY);
seekMusic.getThumb().setColorFilter(getResources().getColor(R.color.colorPrimary), PorterDuff.Mode.SRC_IN);
seekMusic.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mediaPlayer.seekTo(seekBar.getProgress());
}
});
String endTime = evalTime(mediaPlayer.getDuration());
txtsstop.setText(endTime);
final Handler handler = new Handler();
final int delay = 500;
handler.postDelayed(new Runnable() {
@Override
public void run() {
String currTime = evalTime(mediaPlayer.getCurrentPosition());
seekMusic.setProgress(mediaPlayer.getCurrentPosition());
txtsstart.setText(currTime);
handler.postDelayed(this, delay);
}
}, delay);
playButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mediaPlayer.isPlaying()){
playButton.setImageResource(R.drawable.ic_play);
mediaPlayer.pause();
}
else{
playButton.setImageResource(R.drawable.ic_pause);
mediaPlayer.start();
}
}
});
nextButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if(!shuffle){
position = ((position + 1) % mySongs.size());
playSong(position);
}
else {
Random rand = new Random();
position = rand.nextInt(mySongs.size());
playSong(position);
}
}
});
previousButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
position = ((position - 1 >= 0) ? position - 1 : mySongs.size() - 1);
playSong(position);
}
});
shuffleButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!shuffle) {
shuffle = true;
loop = false;
loopButton.getDrawable().setColorFilter(getResources().getColor(R.color.button), PorterDuff.Mode.SRC_ATOP);
shuffleButton.getDrawable().setColorFilter(getResources().getColor(R.color.activeButton), PorterDuff.Mode.SRC_ATOP);
}
else {
shuffle = false;
loop = false;
shuffleButton.getDrawable().setColorFilter(getResources().getColor(R.color.button), PorterDuff.Mode.SRC_ATOP);
}
}
});
loopButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!loop) {
loop = true;
shuffle = false;
shuffleButton.getDrawable().setColorFilter(getResources().getColor(R.color.button), PorterDuff.Mode.SRC_ATOP);
loopButton.getDrawable().setColorFilter(getResources().getColor(R.color.activeButton), PorterDuff.Mode.SRC_ATOP);
}
else {
loop = false;
shuffle = false;
loopButton.getDrawable().setColorFilter(getResources().getColor(R.color.button), PorterDuff.Mode.SRC_ATOP);
}
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
if (loop) {
playSong(position);
loop = true;
}
else nextButton.performClick();
}
});
}
public String evalTime (int duration){
String time = "";
int min = duration / 1000 / 60;
int sec = duration / 1000 % 60;
time += min + ":";
if(sec < 10){
time += "0";
}
time += sec;
return time;
}
public void playSong(int pos){
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer = null;
Uri u = Uri.parse(mySongs.get(pos).toString());
mediaPlayer = MediaPlayer.create(getApplicationContext(), u);
sname = mySongs.get(pos).getName();
txtsname.setText(sname);
seekMusic.setMax(mediaPlayer.getDuration());
String endTime = evalTime(mediaPlayer.getDuration());
txtsstop.setText(endTime);
mediaPlayer.start();
playButton.setImageResource(R.drawable.ic_pause);
setAlbumCover();
}
}
我一直在嘗試,但我嘗試的一切都不起作用。 任何想法如何解決它?
創建MediaPlayer
的新實例后(在您使用MediaPlayer.create(
) 的情況下,您必須等待它准備就緒,然后您才能調用start()
使用mediaPlayer.setOnPreparedListener
並在它觸發時開始播放
但首先要熟悉MediaPlayer
doc 和 state 圖。 可能更容易使用一些庫,例如ExoPlayer
除此之外,您應該有兩種方法:啟動和銷毀玩家。 目前您正在以一種方式(更簡單)在onCreate
中啟動播放器,而另一段類似的代碼在playSong
方法中。 最好從Bundle
中讀取pos
並直接在onCreate
中調用playSong
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.