MediaPlayer问题:所有歌曲同时播放

问题描述

因此,我正在尝试播放用户选择的某些歌曲。我正在制作一个字符串数组,这些字符串是应在MediaPlayer中播放的文件名。问题在于所有歌曲都同时播放。我已经尝试了所有方法,但是仍然不知道如何确保播放器在播放另一首歌曲之前先等待它结束。

这是我尝试过的:

public void play(View v){

        if(player==null)
        {
            while(true) {
                if(i==brojac) break; //checking if the arraylist has ended
                if(player.isPlaying()==false) {
                    i++;
                    String s = lista.get(i).toString();
                    player = MediaPlayer.create(this,(this.getResources().getIdentifier(s,"raw",this.getPackageName())));
                    player.setonCompletionListener(new MediaPlayer.OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mediaPlayer) {
                            stopPlayer();
                        }
                    });
                    player.start();
                }
            }
        }

    }
private void stopPlayer()
    {
        if(player!=null)
        {
            player.release();
            player=null;
        }
    }

编辑

使用下面的答案,一切正常,但是玩家之间存在明显的差距。我已经使用setNextPlayer()函数解决了此问题,但是由于播放器在播放时重新创建播放器,导致应用程序崩溃。

void playSong(int currentSong) {
        player = MediaPlayer.create(this,currentSong);
        player1 = MediaPlayer.create(this,this.getResources().getIdentifier(lista.get(i+1).toString(),getPackageName()));
        player.setNextMediaPlayer(player1);
        player.setonCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                player.release();
                i++;
                if(i==brojac) return;
                player1.start();
                playSong(MainActivity.this.getResources().getIdentifier(lista.get(i).toString(),getPackageName()));
            }
        });
        if(i==0) {
            player.start();
        }
    }

解决方法

我相信你想要这个:

ArrayList<Integer> songs = new ArrayList<>();
    private MediaPlayer mediaPlayer;
    private int currentIndex = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Field[] fields = R.raw.class.getFields();
        for (Field field : fields)
            songs.add(getResources().getIdentifier(field.getName(),"raw",getPackageName()));
        playSong(songs.get(currentIndex));

    }


    void playSong(int currentSong) {
        mediaPlayer = MediaPlayer.create(this,currentSong);
        mediaPlayer.setOnCompletionListener(completeListener);
        mediaPlayer.start();
    }

    MediaPlayer.OnCompletionListener completeListener = mp -> {
        mp.release();
        currentIndex++;
        playSong(songs.get(currentIndex));
    };

说明:

下面的代码将从raw文件夹中获取所有音频文件,并将它们存储在称为歌曲的ArrayList中:

 Field[] fields = R.raw.class.getFields();
 for (Field field : fields)
            songs.add(getResources().getIdentifier(field.getName(),getPackageName()));

播放歌曲:

void playSong(int currentSong) {
        mediaPlayer = MediaPlayer.create(this,currentSong);
        mediaPlayer.setOnCompletionListener(completeListener);
        mediaPlayer.start();
    }

OnCompletionListener听众,当歌曲结束时,您需要增加currentIndex,以便songs.get(currentIndex)为您提供下一首歌曲

MediaPlayer.OnCompletionListener completeListener = mp -> {
        mp.release();
        currentIndex++;
        playSong(songs.get(currentIndex));
    };