为什么MediaPlayer.start不在零开始播放?

时间:2014-12-01 00:05:49

标签: java android audio

这是我的源代码

private MediaPlayer mP;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mP = MediaPlayer.create(getApplicationContext(),R.raw.nintendo);
}

@Override
protected void onResume() {

    super.onResume();
    try {

        mP.prepareAsync();
    } catch (IllegalStateException e) {

        e.printStackTrace();
    }
    mP.setOnPreparedListener(new OnPreparedListener() {

        @Override
        public void onPrepared(MediaPlayer mp) {

            mP.seekTo(0);
            mP.start();
        }
    });
}

@Override
protected void onPause() {

    super.onPause();
    mP.stop();
    mP.release();
}

这是我在尝试运行时在Logcat中获得的内容 enter image description here enter image description here

第64行:mP.stop();

当我按照以下顺序执行此Logcat输出时, 启动 - >主屏幕 - >返回应用 - >主屏幕

现在我知道当您尝试执行无效的状态更改时会发生IllegalStateException。从http://developer.android.com/reference/android/media/MediaPlayer.html开始,我知道有效的状态变化将来自“开始停止”或“停止停止”。我认为我的代码中的逻辑表示有效的状态更改(从onPause开始到onPause中的停止/释放)。 我进一步调试并意识到,在我进入主屏幕并返回应用程序之后,onPrepared没有被调用....我不明白这是因为我之前调用了mP.prepareAsync()(异步以避免阻止这个主要的ui线程)之前。在收集完所有声音资源后,是否应该触发准备?

我查了几个其他主题 不可能是这个Android Media Player,因为我构建了MediaPlayer。 再次,android MediaPlayer not playing mp3 file没有解决我的问题,因为我构建的MediaPlayer很好,它在我第一次启动应用程序时播放了声音。

是否有人发现此代码存在问题?

1 个答案:

答案 0 :(得分:1)

首先,请勿使用prepareAsync()在使用MediaPlayer.create()创建的MediaPlayer上致电prepare(),因为MediaPlayer会照顾您。

来自文档:

http://developer.android.com/reference/android/media/MediaPlayer.html

MediaPlayer.onCreate()...

  

为给定资源ID创建MediaPlayer的便捷方法。上   成功,prepare()已经被调用,绝不可以   再次打电话。

由于您要在onPause()中发布onResume(),如果您想在MediaPlayer中重播,则必须创建新的MediaPlayer.onCreate() 1}}使用onPause()

我建议您不要在mP.pause()中发布MediaPlayer,拨打mP.stop()而不是MediaPlayer,然后您就不必担心重新创建/准备onResume()中的private MediaPlayer mMediaPlayer; private boolean mIsPrepared; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mMediaPlayer = MediaPlayer.create(this, R.raw.raw1); mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mIsPrepared = true; } }); } @Override protected void onResume() { super.onResume(); if (mMediaPlayer != null && mIsPrepared) { mMediaPlayer.seekTo(0); mMediaPlayer.start(); } } @Override protected void onPause() { super.onPause(); if(mMediaPlayer!=null && mIsPrepared){ mMediaPlayer.pause(); } }

以下是一个例子:

{{1}}
相关问题