2012-04-24 3 views
10

이상한 문제가 있습니다. MediaPlayer과 함께 prepareAsync 메소드를 사용하지만, 선언 한 리스너는 결코 해고되지 않습니다. 인터넷 (라디오 방송국)에서 라이브 .mp3 피드를 스트리밍하려고합니다. 리스너를 위해 인라인 메서드를 사용하지만 인터페이스를 성공적으로 구현하지 못했습니다. 멤버 섹션에서AndroId MediaPlayer prepareAsync 메서드

: 활동 onCreate()에서

String url = "http://<my_url>.mp3"; 
MediaPlayer mediaPlayer = new MediaPlayer(); 

가 :

:

다음
ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton); 
playButton.setOnClickListener(this); 
playButton.clearFocus(); 
playButton.setClickable(false); 

mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 
    public void onPrepared(MediaPlayer mp) { 
     ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton); 
     playButton.setClickable(true); 
     mp.start(); 
    } 
}); 

preparePlayer(); 

, 여기에 preparePlayer() 방법입니다 여기에 내 코드의 일부입니다

그리고 (단지 레코드), 내가 청소 수행 onDetroy() :

private void releaseMediaPlayer() { 
    if (mediaPlayer != null) { 
     if(mediaPlayer.isPlaying()) { 
      mediaPlayer.stop(); 
     } 
     mediaPlayer.release(); 
     mediaPlayer = null; 
    } 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    releaseMediaPlayer(); 
} 
+0

로그에 어떤 일이 발생했는지 또는 오류가 있습니까? 인터넷에 대한 허가가 있습니까? – zapl

답변

10

당신은 아마도에 나중에 당신의 Activity의 작성 방법에 OnPreparedListener 및 설정됩니다, 새로운를 만드는 preparePlayer() 메소드의 MediaPlayer 새로 생성 된 MediaPlayer에는 prepareListener 세트가 없습니다. 또한 진행 상황을 확인하려면 errorlistener을 추가해야합니다.

당신은

if (mediaPlayer == null) { 
    mediaPlayer = new MediaPlayer(); 
} 

내부 setOnPreparedListener 전화를 이동뿐만 아니라 setOnErrorListener과 같이 설정을 할 수 있습니다 :

if (mediaPlayer == null) { 
    mediaPlayer = new MediaPlayer(); 
    mediaPlayer.setOnErrorListener(....); 
    mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 
     public void onPrepared(MediaPlayer mp) { 
      ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton); 
      playButton.setClickable(true); 
      mp.start(); 
     } 
    }); 
} 

변경하십시오 e.printStackTrace();

Log.e("tag", e.getMessage(), e); 

희망이 도움이됩니다. 로그 데이터가 있다면 알려주세요. 유용 할 것입니다.

+0

감사합니다. 이전에 null인지 확인하기 위해 조언을 사용했습니다. 하지만 그건 내 문제를 해결하지 못했습니다. –

+0

감사! 아주 잘 설명 된 – Manza

1

밝혀졌지만, 내 내부 메서드 위에 "@Override"를 언급하는 것을 잊어 버렸습니다. 좋아요 :

mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
     ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton); 
     playButton.setClickable(true); 
     mp.start(); 
    } 
}); 

이제 모든 것이 정상적으로 작동합니다. 음 ... 거의, 버퍼링에 영원히 걸리기 때문에 ...

+0

D' oH !!! 하하. .. 당신이 그것을 이해했기 때문에 기쁘다!! :) – petey

+1

꽤 오래되었지만 여전히 @Override 문이 코드를 생성하지 않는다는 점을 지적하고자합니다 * 따라서이 코드 또는 다른 코드 관련 문제에 대한 해결책이 될 수는 없습니다. 참조 용으로 http://stackoverflow.com/a/8545586/2177061을 참조하십시오. – Rick77

+0

아마도이 문제의 원인이 아닙니다. 나는 이제 똑같은 문제를 겪고 있고 "Override"설정이 도움이되지 않습니다. 예제 애플리케이션은 어쨌든 그것을 설정하지 않았습니다. –