【问题标题】:setOnCompletionListener is detecting the completion only for first timesetOnCompletionListener 仅第一次检测完成
【发布时间】:2017-12-27 10:38:13
【问题描述】:

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

    }

【问题讨论】:

    标签: android audio android-mediaplayer playlist


    【解决方案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函数播放其他歌曲。 如果您需要这种方式更详细的信息,我也可以制作示例代码。

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      您的onclickListener 活动仅开始一次。如果你想一首一首地播放歌曲,你必须创建一个循环或者递归地进行。这是一个 sn-p,我在 loadsong() 内部使用了 song0.setOnCompletionListener,并且每次都递归调用 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();
              }
          });
      
      }
      

      }

      【讨论】:

        猜你喜欢
        • 2012-09-28
        • 1970-01-01
        • 1970-01-01
        • 2022-09-17
        • 1970-01-01
        • 2018-07-22
        • 2022-11-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多