2014-06-19 1 views
0

서비스로 MediaPlayer를 사용하여 구현하려는 웹 라디오 스트림이 있습니다. 기본 활동에 2 개의 버튼이 있으며, 서비스를 의도로 설정 한 & stop을 재생 한 다음 서비스를 시작 또는 중지하십시오. 호출되지 않습니다 버튼Android : 서비스가 MediaPlayer.onPreparedListener를 구현합니다.

RadioPlayer 서비스

public class RadioPlayer extends Service implements MediaPlayer.OnPreparedListener{ 

public static String ACTION_PLAY = "ACTION_PLAY"; 
private MediaPlayer mediaplayer = null; 
private boolean isPlaying = false; 


public int onStartCommand(Intent intent, int flags, int startId){ 
    Log.d("SERVICE", "Started"); 
    if(intent.getBooleanExtra(ACTION_PLAY, false)){ 
      play(); 
    } 
    return Service.START_STICKY; 
} 

private void play(){ 
    Log.d("SERVICE", "play()"); 
    if(!isPlaying){ 

     isPlaying = true; 

     try{ 
      Log.d("SERVICE", "1");  
      mediaplayer = new MediaPlayer(); 
      Log.d("SERVICE", "2"); 
      mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
      Log.d("SERVICE", "3"); 
      mediaplayer.setDataSource("http://X.X.X.X"); 
      Log.d("SERVICE", "4"); 
      mediaplayer.prepareAsync(); 
      Log.d("SERVICE", "5"); 
     } catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 



public void onDestory(){ 
    Log.d("SERVICE", "Stop"); 
    stop(); 
} 

private void stop(){ 
    Log.d("SERVICE", "stop()"); 
    if(isPlaying){ 
     isPlaying = false; 
     if(mediaplayer != null){ 
      mediaplayer.stop(); 
      mediaplayer.release(); 
      mediaplayer = null; 
     } 
     //stopForeground(true); 
    } 
} 

@Override 
public void onPrepared(MediaPlayer mp) { 
    Log.d("SERVICE", "onPrepared()"); 
    mediaplayer.start(); 
      //i have also attempted mp.start() with no cigar 

} 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 

} 

onPrepared (MediaPlayer를의 MP)에 따라 (& 내가로드 할 수있는 스트림 시간의 좋은 금액을 기다렸다). onPreparedListener를 성공적으로 구현하는 데 필요한 서비스가 누락 되었습니까?

Log cat 출력의 측면에서, 내가 인식하지 못하는 경우에만 발생하는 것은 데이터 소스가 억압되었다고 말하는 AwesomePlayer ...?

06-19 16:45:04.090: D/pre-SERVICE(22731): clicked() 
06-19 16:45:04.090: D/SERVICE(22731): Started 
06-19 16:45:04.090: D/SERVICE(22731): play() 
06-19 16:45:04.090: D/SERVICE(22731): 1 
06-19 16:45:04.110: W/qdhwcomposer(327): Excessive delay reading vsync: took 66 ms 
06-19 16:45:04.110: D/SERVICE(22731): 2 
06-19 16:45:04.110: D/SERVICE(22731): 3 
06-19 16:45:04.110: I/AwesomePlayer(331): setDataSource_l(URL suppressed) 
06-19 16:45:04.110: D/SERVICE(22731): 4 
06-19 16:45:04.110: D/SERVICE(22731): 5 
06-19 16:45:04.190: W/qdhwcomposer(327): Excessive delay reading vsync: took 49 ms 

UPDATE 단지 .onPrepare으로 시도 후 나는이 비동기 스타일의 작업을 수행하는 경우, 작업 할 수있는 서비스를받을 수 관리 한 문제는 여전히 그건

답변

1

당신이하지 않는 것 같습니다 서 플레이어와 함께 onCompletionListener를 설정하십시오.

mediaplayer.prepareAsync() 뒤에 mediaplayer.setOnCompletionListener(this)을 추가하십시오.

+0

내가 아니라, 스트림이 완료 결코로 onCompletionListener는 인터넷 스트림과 일하는 것이 확실하지 않다를 사용하여 sucsessful 스트림을 얻을 관리 않았다. 나는 단지 그것을 시도했습니다. 준비하고 작동합니다! 그러나 질문은 여전히 ​​비동기 적으로 그것에 대해 서있다. –

+0

나는 그것을 스트림으로 시도해 보았고 작동한다. 'prepareAsync'에 대한 문서에서는 "스트림의 경우 prepareAsync()를 호출해야합니다. 충분한 데이터가 버퍼링 될 때까지 차단하는 것이 아니라 즉시 반환됩니다." – ggueno

0

이 문제는 주관적인 것 같습니다. 내가 비동기 적으로이 코드

mediaplayer.prepareAsync(); 
mediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){ 

@Override 
public void onPrepared(MediaPlayer mp)} 
    mp.start(); 
} }); 
관련 문제