Ошибка медиаплеера: запуск вызван в состоянии 4 - PullRequest
3 голосов
/ 03 января 2012

каждый раз, когда я запускаю свой поток, я получаю две ошибки MediaPlayer.

01-03 12: 04: 35.738: D / PlayerActivity (10164): играть
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): запуск вызывается в состоянии 4
01-03 12: 04: 35.742: E / MediaPlayer (10164): ошибка (-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): ошибка (-38,0)
01-03 12: 04: 38.261: D / PlayerService (10164): готово

В теге отладки "play" я нажал кнопку воспроизведения. Чем вызван мой «onCreate» в сервисе MediaPlayer, который выполняет «setAudioStreamTpe», «setDataSource», «prepareAsync» и затем onPrepared (myMediaPlayer). OnPrepared выполняет только mp.start (). После этого «onPrepared» регистрируется. И затем, в конце «onCreate» из моего сервиса, «onCreate Service» регистрируется.

Почему там 2 наготове ?! С mp.prepare () я не получил ошибок.

Код:

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

Ответы [ 2 ]

7 голосов
/ 03 января 2012

Вы не должны вызывать onPrepared(mp); в onCreate(), он будет вызван, как только MediaPlayer будет готов.

public void onCreate() {
    mp = new MediaPlayer();
    mp.setOnPreparedListener(this);
    prepareMediaPlayer();
    Log.d(TAG, "onCreate Service");
}
0 голосов
/ 05 марта 2018

состояние 4 означает Mediaplayer находится в состоянии подготовки

и мы называем другие действия как

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

или любая другая вещь.

Согласно вашему коду это Onprepared();

Это видно после звонка

Mediaplayer.prepare()

или

Mediaplayer.prepareAsync()

вам не нужно звонить

Mediaplayer.Onprepared()

Он будет вызывать OnPrepares, как только MediaPlayer будет готов просто удалите

onPrepared(mp);

после

prepareMediaPlayer();

И тебе будет хорошо идти

...