android - setOnCompletionListener 仅在第一次检测完成

标签 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();

    }

最佳答案

问题在于每次需要播放歌曲时都需要创建 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 函数来播放其他歌曲。 如果您需要这种方式的更多细节,我也可以制作示例代码。

希望对您有所帮助!

关于android - setOnCompletionListener 仅在第一次检测完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47990675/

相关文章:

android - Geocoder 在 Android 模拟器上工作是否需要 map api key

java - 将形状移动到手指触摸的位置

audio - 使用 ffmpeg 添加重复的背景音频

android - 如何在Android中无间隙地循环播放声音?

android - Android 媒体 Controller 与传输控件的区别

android - Activity 丢失后终止异步任务

java - 横向模式在 Android Studio 中不起作用

java - 如何在Visual Studio代码中的tinySound中加载Sound对象?

javascript - chrome中的Javascript函数使黑线出现

android - Android 可以播放 ADTS AAC 文件吗?