【问题标题】:Mediaplayer Error: start called in state 4Mediaplayer 错误:开始在状态 4 中调用
【发布时间】:2012-01-03 11:17:03
【问题描述】:

每次我开始我的直播时,我都会收到两个 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 服务
01-03 12:04:35.750: E/MediaPlayer(10164): 错误 (-38,0)
01-03 12:04:38.261: D/PlayerService(10164): onPrepared

在调试标签“播放”处,我单击了播放按钮。 比我在 MediaPlayer 服务中的“onCreate”被调用,它执行“setAudioStreamTpe”、“setDataSource”、“prepareAsync”,然后是 onPrepared(myMediaPlayer)。 OnPrepared 仅执行 mp.start()。之后记录“onPrepared”。然后,在我的服务的“onCreate”结束时,会记录“onCreate Service”。

为什么有 2 个 onPrepared?!使用 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");
}

【问题讨论】:

  • 请自行提供代码。

标签: android service media-player


【解决方案1】:

您不应该在onCreate() 中调用onPrepared(mp);,它会在MediaPlayer 准备就绪后调用。

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

【讨论】:

    【解决方案2】:

    状态 4 表示 Mediaplayer 处于准备状态

    我们称其他动作为

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

    或任何其他的东西。

    根据您的代码,它是Onprepared();

    调用后可以看到

    Mediaplayer.prepare()
    

    Mediaplayer.prepareAsync()
    

    你不需要打电话

    Mediaplayer.Onprepared()
    

    一旦 MediaPlayer 准备就绪,它将调用 onPrepares 只需删除

    onPrepared(mp);
    

    之后

    prepareMediaPlayer();
    

    你会很高兴的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      相关资源
      最近更新 更多