2013-02-24 6 views
1

나는 게임을 만들고 있으며, 일단 노래가 백그라운드에서 재생되고 나면 모두 사라져 버렸습니다. 이렇게하려면 MediaPlayer을 생성하고 마지막 항목이 아니면 목록에서 다음 플레이어로 setNextMediaPlayer을 호출하여 반복합니다. 그런 다음 목록의 첫 번째 항목으로 다시 설정합니다. 이것은 작동하지만 루프가 반복되어 첫 번째 노래를 다시 재생하려고 시도 할 때 play()을 잘못된 상태로 호출했다고합니다. 그래서 OnCompleteListener을 추가했습니다. 노래가 끝나면 prepare()을 다시 부르지 만 그 점이 도움이되지 않습니다. 다시 재생하려면 MediaPlayer에 무엇이 필요합니까?루핑 사운드 트랙 재생

- = UPDATE = - 가 여기 내 MediaPlayers을 초기화하는 코드입니다 (마이너스 시도의 및 어획량 그 이후 바로 클러 그것을) :

String[] assets = manager.list("songs"); 
Collections.shuffle(Arrays.asList(assets)); 

for(String name : assets) 
{ 
    MediaPlayer player = new MediaPlayer(); 
    AssetFileDescriptor descriptor = manager.openFd("songs/"+name); 

    player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    player.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength()); 
    player.setOnCompletionListener(_reset); 
    player.prepare(); 

    if(_songs.size() > 0) 
    { 
     _songs.get(_songs.size() - 1).setNextMediaPlayer(player); 
    } 

    _songs.add(player); 
} 

_songs.get(_songs.size() - 1).setNextMediaPlayer(_songs.get(0)); 
+0

'setNextMediaPlayer'는'API 16'에서만 사용 가능합니다 + 당신도 괜찮습니까? 첫 번째 경우, 즉'OnComleteListener'를 재정의하지 않고 언제'prepare()'를 호출합니까? – iTech

+0

그래, 나는 그걸로 괜찮아. 나는'MediaPlayers'를 초기화하는 데 사용하는 코드를 포함하도록 내 질문을 업데이트했습니다. – CaseyB

답변

0

당신이 onCompleteListener 내부 prepare를 호출 한 후 같은 오류가 발생하는 경우 나중에 준비되지 않은 다음 MediaPlayeronCompleteListener 전에 호출되기 때문일 수 있습니다. Circular Linked List 그래서 당신이 그것을 그것을 현재 곡 이름을 지정하고 같은

  • 일부 데이터 구조에 노래의 순서를 유지 :

    나는 당신의 문제를 해결할뿐만 아니라 더 효율적이 될 수있는 다른 방법을 제안 다음 하나

  • 당신에게 준비하고 첫번째 노래
  • 에게 무시 onPrepared 재생을 시작하고 새로 생성과 setNextMediaPlayer를 호출하여 데이터 구조에서 다음 노래 이름을 얻고 MediaPlayer 객체
  • 준비

MediaPlayer의 인스턴스를 많이 만들지 않으므로이 방법이 더 효율적이라고 생각합니다. 또한 현재 노래를 시작할 때마다 준비된 nextMediaPlayer을 제공합니다.

+0

나는 약간 다른 길을 갔다. 그러나 이것은 바른 길에 나를 뒀다! 고맙습니다! – CaseyB