setOnCompletionListener仅在第一次检测到完成

时间:2017-12-27 10:38:13

标签: android audio android-mediaplayer playlist

setOnCompletionListener仅在第一次检测到歌曲的完成。在下面的代码中,song1song2会一个接一个地播放,但其余的歌曲都没有播放。

我想逐个播放歌曲,并在歌曲之间添加一些沉默。

MediaPlayer song0=new MediaPlayer();
     int track = 0;
  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
  song0=MediaPlayer.create(this,R.raw.song1);
 play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               function();
             }
        });

        song0.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer song0) {
                track++;
                loadsong();

                function();
            }

        });
    }
    void loadsong()
    {

        if(track==1)        song0=MediaPlayer.create(this,R.raw.song2);
        if(track==2)        song0=MediaPlayer.create(this,R.raw.song3);
        if(track==3)        song0=MediaPlayer.create(this,R.raw.song4);
    }**strong text**


    void function(){
        if(track<4) song0.start();
        else
            song0.stop();

    }

2 个答案:

答案 0 :(得分:1)

问题是每次需要播放歌曲时都会创建MediaPlayer对象。因此,每次为另一首歌创建MediaPlayer对象后,您需要设置OnCompletionListener。

因此,您可以更改代码中的几行来解决问题。

MediaPlayer song0=new MediaPlayer();
int track = 0;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    song0=MediaPlayer.create(this,R.raw.song1);
    play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               function();
             }
        });

        song0.setOnCompletionListener(m_CompletionListener);
    }
    void loadsong()
    {

        if(track==1) {
        song0=MediaPlayer.create(this,R.raw.song2); 
        song0.setOnCompletionListener(m_CompletionListener); 
    }
        if(track==2) {
        song0=MediaPlayer.create(this,R.raw.song3); 
        song0.setOnCompletionListener(m_CompletionListener); 
    }

        if(track==3) {
        song0=MediaPlayer.create(this,R.raw.song4); 
        song0.setOnCompletionListener(m_CompletionListener); 
    }

    }**strong text**


    void function(){
        if(track<4) song0.start();
        else
            song0.stop();

    }
    MediaPlayer.OnCompletionListener m_CompletionListener = new MediaPlayer.OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer song0) {
                track++;
                loadsong();
                function();
            }

        };

另一种实现方法是只创建一个MediaPlayer对象,而不是每次都创建MediaPlayer对象,调用setDataSource函数来播放其他歌曲。 如果您需要更多细节,我也可以制作示例代码。

我希望它会对你有所帮助!

答案 1 :(得分:0)

您的onclickListener活动仅启动一次。如果你想逐个播放歌曲,你必须创建一个循环或者必须递归地进行。这是我在song0.setOnCompletionListener内使用loadsong()并在事件中每次递归调用loadsong()的片段。稍微更改了loadsong()方法。这是代码:

public class MainActivity extends AppCompatActivity {
private Button play;
MediaPlayer song0 = new MediaPlayer();
int track = 0;

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

    play.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            loadsong();
        }
    });


}


void loadsong() {
    track++;
    if (track == 1) {
        song0 = MediaPlayer.create(this, R.raw.track1);
        song0.start();
    }else if (track == 2) {
        song0 = MediaPlayer.create(this, R.raw.track2);
        song0.start();
    }else if (track == 3) {
        song0 = MediaPlayer.create(this, R.raw.track3);
        song0.start();
    }else if (track > 3) {
        song0.stop();
    }

    song0.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer song) {
            song.stop();
            loadsong();
        }
    });

}

}