2012-08-24 3 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

나는 당신을 befor 블록을 선택하면 첫 번째를 닫 생각이 경우 트랙 == 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)); 
관련 문제