2017-07-23 254 views
1

當我點擊播放列表中的任何歌曲第一次播放下一首歌曲時,此問題只發生在第二次或第二次點擊播放列表中的任何歌曲它工作正常。我想在媒體播放器中自動播放下一首歌曲

但是主要問題是,任何歌曲結束後都無法播放下一首歌曲。

mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mediaPlayer) { 
      mediaPlayer.reset(); 
       // play next song 
       if(listView_click_arg2 < (songPath.length - 1)){ 
        listView_click_arg2=listView_click_arg2+1; 
       } 
       else{ 
        // play first song 
        listView_click_arg2=0; 
       } 
      try { 
       playSong(songPath[listView_click_arg2]); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 
    }); 


private void playSong(String path) throws IllegalArgumentException, IllegalStateException, IOException { 
    startTime=0; 
    finalTime=0; 
    oneTimeOnly=0; 
    mediaPlayer.stop(); 
    mediaPlayer=null; 
    mediaPlayer=new MediaPlayer(); 
    mediaPlayer.setDataSource(path); 
    mediaPlayer.prepare(); 
    mediaPlayer.start(); 
} 
+0

如果我們在playSong函數中將setOnCompletionListener()放在setDataSource()之後,這段代碼將會正常工作。 – Aashish

回答

0

我發現你有一個問題,因爲mediaPlayer.reset()函數。它說

當一個MediaPlayer對象剛剛使用new創建或調用reset()後,它處於空閒狀態;並在release()被調用後,它處於End狀態。這兩個狀態之間是MediaPlayer對象的生命週期。

請通過此鏈接。有一個很好的流程圖: https://developer.android.com/reference/android/media/MediaPlayer.html

enter image description here

我相信,您刪除mediaPlayer.reset()的onCompletionListener體內後,會得到解決。

+0

我刪除了mediaPlayer.reset()方法,但問題仍然像以前一樣存在。 – Aashish

0

嘗試添加release()。它看起來像內存不足問題。

private void playSong(String path) throws IllegalArgumentException, IllegalStateException, IOException { 
    startTime=0; 
    finalTime=0; 
    oneTimeOnly=0; 
    // changing the state of mediaPlayer inside its own callback is a bad practice. 
    //mediaPlayer.stop(); 
    mediaPlayer.release(); // <<------ Add this before reference is gone. 
    mediaPlayer=null; 
    mediaPlayer=new MediaPlayer(); 
    mediaPlayer.setDataSource(path); 
    mediaPlayer.prepare(); 
    mediaPlayer.start(); 
} 
相關問題