Java 如何将mediaplayer自动切换到下一个曲目?
我正在尝试在歌曲结束时自动将播放器切换到下一首曲目,它会自动跟随铃声重新播放。并且当前时间调谐应在texöe视图中输出 setOnCompletionListener-不工作,当前曲目结束时不会转到下一个曲目 //变数Java 如何将mediaplayer自动切换到下一个曲目?,java,android,android-studio,Java,Android,Android Studio,我正在尝试在歌曲结束时自动将播放器切换到下一首曲目,它会自动跟随铃声重新播放。并且当前时间调谐应在texöe视图中输出 setOnCompletionListener-不工作,当前曲目结束时不会转到下一个曲目 //变数 int[] soundsRawResIds = new int[]{R.raw.belarus, R.raw.russian, R.raw.japan, R.raw.litva, R.raw.england, R.raw.finlandia
int[] soundsRawResIds = new int[]{R.raw.belarus, R.raw.russian, R.raw.japan,
R.raw.litva, R.raw.england, R.raw.finlandia, R.raw.france};
private final Handler handler = new Handler();
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.activity_main);
initViews();
currenttime=(TextView)findViewById(R.id.timeSound);
buttonPlayStop = (Button) findViewById(R.id.ButtonPlayStop);
}
private void initViews() {
mediaPlayer = MediaPlayer.create(this, soundsRawResIds[0]);
seekBar = (SeekBar) findViewById(R.id.seekBar);
seekBar.setMax(mediaPlayer.getDuration());
seekBar.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
seekChange(v);
return false;
}
});
}
private void seekChange(View v){
if(mediaPlayer.isPlaying()){
seekBar = (SeekBar)v;
mediaPlayer.seekTo(seekBar.getProgress());
}
}
public void playAndStop(View v){
if (buttonPlayStop.getText() == getString(R.string.play_str)) {
buttonPlayStop.setText(getString(R.string.pause_str));
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
index++;
mp.reset();
if (index < soundsRawResIds.length) {
try {
AssetFileDescriptor afd = getResources().openRawResourceFd(soundsRawResIds[index]);
if (afd != null) {
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mp.prepare();
}
} catch (Exception ex) {
// report a crash
}
} else {
// done with media player
mp.release();
mp = null;
}
}
});
mediaPlayer.start();
startPlayProgressUpdater();
}else {
buttonPlayStop.setText(getString(R.string.play_str));
mediaPlayer.pause();
}
}
public void startPlayProgressUpdater() {
seekBar.setProgress(mediaPlayer.getCurrentPosition());
if (mediaPlayer.isPlaying()) {
Runnable notification = new Runnable() {
public void run() {
startPlayProgressUpdater();
if(seekBar.getProgress()==100){
for(int index=0;index<soundsRawResIds.length;index++){
index++;
}
}
}
};
handler.postDelayed(notification,1000);
}else{
mediaPlayer.pause();
buttonPlayStop.setText(getString(R.string.play_str));
seekBar.setProgress(0);
}
}
}
int[]soundsRawResIds=新int[]{R.raw.白俄罗斯,R.raw.俄语,R.raw.japan,
里特瓦,英格兰,芬兰,法国};
私有最终处理程序=新处理程序();
@凌驾
创建公共空间(捆绑冰柱){
超级冰柱;
setContentView(R.layout.activity_main);
initViews();
currenttime=(TextView)findViewById(R.id.timeSound);
buttonPlayStop=(按钮)findViewById(R.id.buttonPlayStop);
}
私有void initViews(){
mediaPlayer=mediaPlayer.create(这个,soundsRawResIds[0]);
seekBar=(seekBar)findViewById(R.id.seekBar);
seekBar.setMax(mediaPlayer.getDuration());
seekBar.setOnTouchListener(新视图.OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
见变更(五);
返回false;
}
});
}
私人作废见变更(视图五){
if(mediaPlayer.isPlaying()){
seekBar=(seekBar)v;
mediaPlayer.seekTo(seekBar.getProgress());
}
}
公共无效播放和停止(视图v){
if(buttonPlayStop.getText()==getString(R.string.play_str)){
buttonPlayStop.setText(getString(R.string.pause_str));
mediaPlayer.setOnCompletionListener(新的mediaPlayer.OnCompletionListener(){
@凌驾
完成时的公共作废(MediaPlayer mp){
索引++;
mp.reset();
if(索引<声音剩余长度){
试一试{
AssetFileDescriptor afd=getResources().openRawResourceFd(soundsRawResIds[index]);
如果(afd!=null){
setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
afd.close();
mp.prepare();
}
}捕获(例外情况除外){
//报告车祸
}
}否则{
//完成与媒体播放器
mp.release();
mp=null;
}
}
});
mediaPlayer.start();
startPlayProgressUpdater();
}否则{
按钮laystop.setText(getString(R.string.play_str));
mediaPlayer.pause();
}
}
public void startPlayProgressUpdater(){
seekBar.setProgress(mediaPlayer.getCurrentPosition());
if(mediaPlayer.isPlaying()){
Runnable通知=新的Runnable(){
公开募捐{
startPlayProgressUpdater();
如果(seekBar.getProgress()==100){
对于(int index=0;index将onCompletionListener设置为mediaPlayer)
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//custom method to play next song
playNextSong();
}
});
从数组播放的简单示例
private String[] songPaths;
private int playingPostion=0;
public void play(){
if(mediaPlayer==null){
mediaPlayer=new MediaPlayer();
}else{
mediaPlayer.reset();
}
//your array contains resource files.First convert them to a uri before submitting to the mediaPlayer
String uri = "android.resource://" + getPackageName() + "/"+songPaths[playingPosition];
mediaPlayer.setDataSource(Uri.parse(uri));
mediaPlayer.prepare();
mediaPlayer.start();
//prepare your textviews and seekbar
//prepare the player to play next song from array after completing current song
if(playingPosition==0){
if(songPaths.length>1){
playingPosition++;
}
}else if((playingPosition+1)==songPaths.length){
playingPosition=0;
}else{
playingPostion++;
}
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
play();
//do anything else you desire
}
});
}
上面的代码只是一个示例。请使用您的线程并正确地尝试catch语句。我添加了此方法,但我的歌曲在停止时会重复。我正在尝试从阵列中收听音乐您创建新的播放器MediaPlayer mp erro-38您的阵列包含资源。将它们转换为uri,然后将其设置为数据源。更新了答案。是否不起作用,当当前为endedI时,它不会进入下一个曲目。我看到您添加了我编写的方法,但我没有看到您在任何地方调用它。在playAndStop(视图v)中,您使用了mediaPlayer.start()。我没有得到什么?调用play()而不是medaiPlayer.start()。您必须相应地修改其余代码。
private String[] songPaths;
private int playingPostion=0;
public void play(){
if(mediaPlayer==null){
mediaPlayer=new MediaPlayer();
}else{
mediaPlayer.reset();
}
//your array contains resource files.First convert them to a uri before submitting to the mediaPlayer
String uri = "android.resource://" + getPackageName() + "/"+songPaths[playingPosition];
mediaPlayer.setDataSource(Uri.parse(uri));
mediaPlayer.prepare();
mediaPlayer.start();
//prepare your textviews and seekbar
//prepare the player to play next song from array after completing current song
if(playingPosition==0){
if(songPaths.length>1){
playingPosition++;
}
}else if((playingPosition+1)==songPaths.length){
playingPosition=0;
}else{
playingPostion++;
}
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
play();
//do anything else you desire
}
});
}