【问题标题】:Playing songs one after another in Android(Java)在Android(Java)中一首首歌曲
【发布时间】:2020-06-28 13:51:39
【问题描述】:

我想在我的音乐播放器应用中依次播放歌曲。我检查了this question,但我的音乐播放器只播放下一首歌曲一次。之后它停止。例如,它正在播放歌曲 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,但它仍然只播放了下一首歌曲。

【问题讨论】:

    标签: java android


    【解决方案1】:

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

    如果您想保留您的 ArrayList,请尝试调试您的 song_nosong 变量,以缩小歌曲顺序逻辑或 MediaPlayer 使用方面的问题。

    【讨论】:

    • 如果我使用队列,我会在使用remove()poll() 播放一次后丢失歌曲ID。我不想那样做。我尝试在调用听者时检查歌曲编号,但我发现听者只被调用一次。
    • 您在playSong() 方法中将MediaPlayer 变量设为null,mp.setOnCompletionListener 调用在哪里?重新创建 mp 后,您可能需要再次设置它。你真的需要每次都重新创建它吗?
    • 是的,这似乎是问题所在。我需要在mp.setDataSource() 之后致电mp.setOnCompleteListener()。之后就修好了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多