Java 如何将mediaplayer自动切换到下一个曲目?

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

我正在尝试在歌曲结束时自动将播放器切换到下一首曲目,它会自动跟随铃声重新播放。并且当前时间调谐应在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, 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
                }
            });  
}