Search code examples
androidservicemedia-player

Mediaplayer Error: start called in state 4


everytime I start my stream, I get two MediaPlayer Errors.

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

At the Debug Tag "play", I clicked the play button. Than my "onCreate" in the MediaPlayer service is called which executes "setAudioStreamTpe", "setDataSource", "prepareAsync", and then onPrepared(myMediaPlayer). OnPrepared only executes mp.start(). After that "onPrepared" is logged. And then, at the end of the "onCreate" from my service, "onCreate Service" is logged.

Why are there 2 onPrepared?! With mp.prepare() i got no errors.

The Code:

    @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");
}

Solution

  • You should not call onPrepared(mp); in onCreate(), it will be called once the MediaPlayer is ready.

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