2012-08-24 21 views
1

我有3個MediaPlayers:Track 0,Track 1和Track 2.我希望每個音軌在其完成前一次啓動,一旦最後一個音軌完成,我想要回到歌曲0並開始循環。這是我做的循環是沒有做到這一點:爲什麼這個循環無法通過我的第一個MediaPlayer

public void myMusic() { 
    while (y > 0) { 
     music.get(track).start(); 

     if (music.get(track).isPlaying() == false) { 
      music.get(track).stop(); 
      track++; 

      if (track == 3) { 
       track = 0; 
       for (int i = 0; i < 3; i++) { 
        try { 
         music.get(i).prepare(); 
        } catch (IllegalStateException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        music.get(i).seekTo(0); 
       } 
      } 
     } 
     y--; 
    } 
} 

回答

0

我認爲你必須關閉第一個如果塊爲您檢查如果跟蹤== 3。但這只是一個建議,我不嘗試。

0

坦率地說,我會放棄整個循環的概念,並與OnCompletionListener去。像這樣的東西可能工作 - 我沒有測試過這一點,只是畫了這一點,我瘋了頭的,但把它作爲概念:

private class LoopingCompletionListener implements OnCompletionListener { 
    private int index; 
    private int count; 
    private int[] ids; 
    private Resources res; 

    public LoopingCompletionListener(int[] musicIds, Resources res) { 
     //start on the second ID since you start the player with 
     //the first one 
     index = 1; 
     count = musicIds.length(); 
     this.ids = ids; 
     this.res = res; 
    } 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
     //Basically, just keep it between 0-2 -- this might need tweaking 
     index = ((index + 2) % count) - 1; 

     AssetFileDescriptor afd = res.openRawResourceFd(ids[index]); 
     FileDescriptor fd = afd.getFileDescriptor(); 

     mp.reset(); 
     mp.setDataSource(fd, afd.getStartOffset(), afd.getLength()); 
     mp.prepare(); 
     mp.start(); 
    } 
} 

//Meanwhile, in onCreate()... 
int[] musicIds = { R.raw.track01, R.raw.track02, R.raw.track03 }; 

MediaPlayer mediaPlayer = MediaPlayer.create(this, musicIds[0]); 
mediaPlayer.setOnCompletionListener(
     new LoopingCompletionListener(musicIds, getResources()); 
mediaPlayer.start(); 
0

如果我猜的話,isPlaying()只有false當您設置MediaPlayer狀態爲暫停或停止。換句話說,您不能簡單地依靠它來確定音樂何時到達流的末尾以確定何時完成。

另外,從文檔:

需要注意的是,從開始狀態到暫停狀態,反之亦然過渡的播放引擎異步發生。在調用isPlaying()方法更新狀態之前可能需要一些時間,對於流式內容而言,可能需要數秒。

所以這是一個不可靠的指標,像這樣的用例。

你可以做的就是利用MediaPlayer.OnCompletionListener。爲每個可用的MediaPlayer註冊一個,完成後,您可以前進到下一個MediaPlayer。

因此,像這樣:

public class PlayUponCompleteListener implements MediaPlayer.OnCompletionListener { 
    WeakReference<MediaPlayer> mNextPlayer; 

    public PlayUponCompleteListener(MediaPlayer mp) { 
    mNextPlayer = new WeakReference<MediaPlayer>(mp); 
    } 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
    mp.stop(); 
    mp.reset(); 
    if(mNextPlayer.get() != null) { 
     mNextPlayer.start(); 
    } 
    } 
} 

然後,註冊它們像這樣:

mp1.setOnCompletionListener(new CompletionListener(mp2)); 
mp2.setOnCompletionListener(new CompletionListener(mp3)); 
mp3.setOnCompletionListener(new CompletionListener(mp1)); 
相關問題