代码之家  ›  专栏  ›  技术社区  ›  Nagelly Arunkumar

setOnCompletionListener仅第一次检测到完成

  •  1
  • Nagelly Arunkumar  · 技术社区  · 8 年前

    setOnCompletionListener 只是第一次检测到歌曲的完成。在下面的代码中 song1 和 song2 一首接一首播放,但未播放剩余的歌曲。

    我想一首接一首地播放歌曲,并在歌曲之间加入一些沉默。

    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 回复  |  直到 8 年前
        1
  •  1
  •   Yuichi Akiyoshi    8 年前

    问题是,每次需要播放歌曲时,都会创建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
  •  0
  •   WS Ayan    8 年前

    你的 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();
            }
        });
    
    }
    

    }