2012-01-03 6 views
2

스트림을 시작할 때마다 두 개의 MediaPlayer 오류가 발생합니다.미디어 플레이어 오류 : 상태 4에서 호출 시작

01-03 12:04:35.738: D/PlayerActivity(10164): play
01-03 12:04:35.742: D/PlayerService(10164): setAudiotStreamType
01-03 12:04:35.742: D/PlayerService(10164): setDataSource
01-03 12:04:35.742: D/PlayerService(10164): prepareAsync
01-03 12:04:35.742: E/MediaPlayer(10164): start called in state 4
01-03 12:04:35.742: E/MediaPlayer(10164): error (-38, 0)
01-03 12:04:35.742: D/PlayerService(10164): onPrepared
01-03 12:04:35.742: D/PlayerService(10164): onCreate Service
01-03 12:04:35.750: E/MediaPlayer(10164): Error (-38,0)
01-03 12:04:38.261: D/PlayerService(10164): onPrepared

디버그 태그 "play"에서 재생 버튼을 클릭했습니다. "setAudioStreamTpe", "setDataSource", "prepareAsync"및 onPrepared (myMediaPlayer)를 실행하는 MediaPlayer 서비스의 "onCreate"가 호출됩니다. OnPrepared는 mp.start() 만 실행합니다. 그 후에 "onPrepared"가 기록됩니다. 그런 다음 내 서비스의 "onCreate"끝에 "onCreate Service"가 기록됩니다.

왜 2 가지가 준비되어 있습니까?! mp.prepare()를 사용하면 오류가 없습니다.

강령 다음 MediaPlayer를가 준비되면

@Override 
public void onCreate() { 
    mp = new MediaPlayer(); 
    mp.setOnPreparedListener(this); 
    prepareMediaPlayer(); 
    onPrepared(mp); 
    Log.d(TAG, "onCreate Service"); 
} 


    public void prepareMediaPlayer() 
{ 
    try { 
     mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     Log.d(TAG, "setAudiotStreamType"); 
     mp.setDataSource(PlayerActivity.soundUrl); 
     Log.d(TAG, "setDataSource"); 
     mp.prepareAsync(); 
     Log.d(TAG, "prepareAsync"); 

    } 
    catch (IOException e) {} 
    catch (IllegalArgumentException e) {} 
    catch (IllegalStateException e) {} 

} 


    @Override 
public void onPrepared(MediaPlayer mp) { 
    mp.start(); 
    if (PlayerService.mp.isPlaying() == true){ 
     notification(); 
     PlayerActivity.mpState = PlayerActivity.PLAYING; 
    } 
    Log.d(TAG, "onPrepared"); 
} 
+0

코드 자체를주십시오 갈 수있을 것입니다. – MByD

+0

코드가 추가되었습니다. 희망이 도움이됩니다! – Leandros

답변

6

당신은 onCreate()에서 onPrepared(mp);를 호출하지 않아야합니다, 그것은 호출됩니다.

public void onCreate() { 
    mp = new MediaPlayer(); 
    mp.setOnPreparedListener(this); 
    prepareMediaPlayer(); 
    Log.d(TAG, "onCreate Service"); 
} 
+0

음. 아주 간단합니다. 감사! :) – Leandros

0

상태 4 Mediaplayer 상태

을 준비하고 우리가

Mediaplayer.start() 
Mediaplayer.stop() 
Mediaplayer.pause() 

또는 어떤 다른 일이 같은 다른 작업을 호출 의미한다.

코드에 따라 경찰은 Onprepared();

당신은 당신이 호출 할 필요는 없습니다

Mediaplayer.prepare() 

또는

Mediaplayer.prepareAsync() 

를 호출 한 후 것을 볼 수있다

Mediaplayer.Onprepared() 

MediaPlayer를가 준비되면 그것은 그냥

prepareMediaPlayer(); 

onPrepared(mp); 

을 제거 onPrepares를 호출합니다 그리고 당신은