提问者:小点点

在安卓系统陆续播放歌曲(Java)


我想在我的音乐播放器app中一首接一首地播放歌曲。 我检查了这个问题,但我的音乐播放器只播放下一首歌一次。 之后它就停止了。 例如,它正在播放歌曲A,然后它会播放下一首歌曲B,但在歌曲B之后它不会播放歌曲C。

下面是我的代码:

OnCompleteListener:

//mp is MediaPlayer object, al is ArrayList of songs and their ids(R.raw.song), song_no is the index of the song in al
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                song_no = (song_no +1) % al.size();
                playSong();
            }
        });

我有相同的代码为“下一步”按钮,这是完美的工作,甚至在到达列表的末尾,它循环回来。 播放歌曲功能:

public void playSong()
    {
        song = Uri.parse("android.resource://" + getPackageName() + "/" + al.get(song_no).id());
        try
        {
            mp.stop();
            mp.reset();
            mp.release();
            mp = null;
        }
        catch(Exception e)
        {
            Log.d("playSong", e.toString();
        }
        mp = MediaPlayer.create(getApplicationContext(), song);

        mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });
    }

我尝试删除mp.reset()mp.release()mp=null,但它仍然只播放下一首歌一次。


共1个答案

匿名用户

看起来您想要一个队列数据结构,希望它比跟踪索引更容易处理。 您的al变量将存储要播放的歌曲队列,在您的OnComplety方法中,您可以调用一个PlayNextSong()方法,该方法使用Poll()Remove()处理队列,以获取下一首歌曲并播放,直到队列为空。

如果要保留ArrayList,请尝试调试song_nosong变量,以便在歌曲顺序逻辑或MediaPlayer用法中出现问题时缩小范围。