【发布时间】:2021-08-13 07:26:30
【问题描述】:
我正在通过教程制作音乐播放器,试图让它更先进,我用谷歌搜索了我的问题,但找不到答案。我对 onCompletion 方法有问题,由于某种原因它只被调用一次,我打开第一首歌曲,第二首歌曲开始(调用 onCompletion),然后下一首歌曲不开始(不再调用 onCompletion)。我的seekbar也有问题,几首歌曲后,它并没有改变它的位置,而且非常随机。
public class PlayerActivity extends AppCompatActivity {
ImageButton playBtn, nextBtn, prevBtn, fastforwardBtn, fastrewindBtn, repeatBtn, shuffleBtn;
TextView songName, timeStart, timeStop;
SeekBar seekBar;
BarVisualizer visualizer;
ImageView albumArt;
private boolean repeatBtnPressed, shuffleBtnPressed;
String sName;
public static final String EXTRA_NAME = "song_name";
static MediaPlayer mediaPlayer;
int position;
ArrayList<File> mySongs;
Thread updateSeekBar;
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onDestroy() {
if (visualizer != null) {
visualizer.release();
}
super.onDestroy();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player);
//customising action bar
// getSupportActionBar().setTitle("Now Playing");
// getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// getSupportActionBar().setDisplayShowHomeEnabled(true);
playBtn = findViewById(R.id.playbtn);
nextBtn = findViewById(R.id.nextbtn);
prevBtn = findViewById(R.id.prevbtn);
fastforwardBtn = findViewById(R.id.fastforwardbtn);
fastrewindBtn = findViewById(R.id.fastrewindbtn);
repeatBtn = findViewById(R.id.repeatbtn);
shuffleBtn = findViewById(R.id.shufflebtn);
songName = findViewById(R.id.songname);
timeStart = findViewById(R.id.timestart);
timeStop = findViewById(R.id.timeend);
seekBar = findViewById(R.id.seekbar);
visualizer = findViewById(R.id.blastvisualizer);
albumArt = findViewById(R.id.albumart);
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
}
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
mySongs = (ArrayList) bundle.getParcelableArrayList("songs");
String songName = intent.getStringExtra("songname");
position = bundle.getInt("pos", 0);
this.songName.setSelected(true);
Uri uri = Uri.parse(mySongs.get(position).toString());
sName = mySongs.get(position).getName();
this.songName.setText(sName);
mediaPlayer = MediaPlayer.create(getApplicationContext(), uri);
mediaPlayer.start();
Runnable target;
updateSeekBar = new Thread() {
@Override
public void run() {
int totalDuration = mediaPlayer.getDuration();
int currentPosition = 0;
while (currentPosition < totalDuration) {
try {
sleep(500);
currentPosition = mediaPlayer.getCurrentPosition();
seekBar.setProgress(currentPosition);
seekBar.setMax(mediaPlayer.getDuration()); // added to fix seekbar bug
} catch (InterruptedException | IllegalStateException e) {
e.printStackTrace();
}
}
}
};
seekBar.setMax(mediaPlayer.getDuration());
updateSeekBar.start();
//seekbar color
seekBar.getProgressDrawable().setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.MULTIPLY);
seekBar.getThumb().setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.SRC_IN);
seekBar.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 = createTime(mediaPlayer.getDuration());
timeStop.setText(endTime);
final Handler handler = new Handler();
final int delay = 0; // 1000 on default
handler.postDelayed(new Runnable() {
@Override
public void run() {
String currentTime = createTime(mediaPlayer.getCurrentPosition());
timeStart.setText(currentTime);
handler.postDelayed(this, delay);
}
}, delay);
playBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mediaPlayer.isPlaying()) {
playBtn.setBackgroundResource(R.drawable.ic_play);
mediaPlayer.pause();
} else {
playBtn.setBackgroundResource(R.drawable.ic_pause);
mediaPlayer.start();
}
}
});
// next listener
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
System.out.println("OnCompletionListener called");
nextBtn.performClick();
}
});
int audioSessionId = mediaPlayer.getAudioSessionId();
if (audioSessionId != -1) {
visualizer.setAudioSessionId(audioSessionId);
}
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer.stop();
mediaPlayer.release();
position = ((position + 1) % mySongs.size());
Uri u = Uri.parse(mySongs.get(position).toString());
mediaPlayer = MediaPlayer.create(getApplicationContext(), u);
sName = mySongs.get(position).getName();
PlayerActivity.this.songName.setText(sName);
mediaPlayer.start();
playBtn.setBackgroundResource(R.drawable.ic_pause);
startAnimation(albumArt);
String endTime = createTime(mediaPlayer.getDuration());
timeStop.setText(endTime);
int audioSessionId = mediaPlayer.getAudioSessionId();
if (audioSessionId != -1) {
visualizer.setAudioSessionId(audioSessionId);
}
}
});
prevBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer.stop();
mediaPlayer.release();
position = ((position - 1) < 0) ? (mySongs.size() - 1) : (position - 1);
Uri u = Uri.parse(mySongs.get(position).toString());
mediaPlayer = MediaPlayer.create(getApplicationContext(), u);
sName = mySongs.get(position).getName();
PlayerActivity.this.songName.setText(sName);
mediaPlayer.start();
playBtn.setBackgroundResource(R.drawable.ic_pause);
startAnimation(albumArt);
String endTime = createTime(mediaPlayer.getDuration());
timeStop.setText(endTime);
int audioSessionId = mediaPlayer.getAudioSessionId();
if (audioSessionId != -1) {
visualizer.setAudioSessionId(audioSessionId);
}
}
});
fastforwardBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.seekTo(mediaPlayer.getCurrentPosition() + 10000);
}
}
});
fastrewindBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.seekTo(mediaPlayer.getCurrentPosition() - 10000);
}
}
});
repeatBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!repeatBtnPressed) {
repeatBtnPressed = true;
repeatBtn.setBackgroundResource(R.drawable.ic_repeat_on);
} else {
repeatBtnPressed = false;
repeatBtn.setBackgroundResource(R.drawable.ic_repeat_off);
}
}
});
shuffleBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!shuffleBtnPressed) {
shuffleBtnPressed = true;
//repeatBtnPressed = false;
shuffleBtn.setBackgroundResource(R.drawable.ic_shuffle_on);
} else {
shuffleBtnPressed = false;
shuffleBtn.setBackgroundResource(R.drawable.ic_shuffle_off);
}
}
});
}
public void startAnimation(View view) {
Object target;
ObjectAnimator animator = ObjectAnimator.ofFloat(albumArt, "rotation", 0f, 360f);
animator.setDuration(1000);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(animator);
animatorSet.start();
}
public String createTime(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 randomSong() {
mediaPlayer.stop();
mediaPlayer.release();
Random r = new Random();
int randomPos = r.nextInt(mySongs.size());
position = ((position + randomPos) % mySongs.size());
Uri u = Uri.parse(mySongs.get(position).toString());
mediaPlayer = MediaPlayer.create(getApplicationContext(), u);
sName = mySongs.get(position).getName();
songName.setText(sName);
mediaPlayer.start();
playBtn.setBackgroundResource(R.drawable.ic_pause);
startAnimation(albumArt);
String endTime = createTime(mediaPlayer.getDuration());
timeStop.setText(endTime);
shuffleBtnPressed = true;
int audioSessionId = mediaPlayer.getAudioSessionId();
if (audioSessionId != -1) {
visualizer.setAudioSessionId(audioSessionId);
}
}
}
【问题讨论】:
-
检查 this 的搜索栏
-
顺便说一下,您提供的链接一般是关于 MediaPlayer,而不是关于 seekbar。
-
是的,检查他在教程中提供的搜索条码。
-
我已经查过了,呵呵,如果你不知道如何帮助,请不要尝试。
-
以这种态度@Redas Shuliakas 祝你的编程生涯一切顺利
标签: java android mobile android-mediaplayer