簡體   English   中英

為什么MediaPlayer.start不從零開始播放?

[英]Why doesn't MediaPlayer.start start the playback at zero?

這是我的源代碼

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中獲得的信息 在此處輸入圖片說明在此處輸入圖片說明

第64行:mP.stop();

當我按以下順序執行時,啟動->主屏幕->返回應用程序->主屏幕,就會發生此Logcat輸出

現在,我知道當您嘗試執行無效的狀態更改時會發生IllegalStateException。 http://developer.android.com/reference/android/media/MediaPlayer.html ,我知道有效的狀態更改是從“開始到停止”或“停止到停止”。 我以為我的代碼中的邏輯代表了有效的狀態更改(從onPause中的開始到onPause中的停止/釋放)。 我進行了進一步調試,意識到在轉到主屏幕並返回到應用程序后,onPrepared不會被調用。...我也不理解這一點,因為我在手動處理之前調用了mP.prepareAsync()(異步避免阻止此主ui線程)。 收集完所有聲音資源后,是否應該不觸發onPrepared?

我檢查了其他一些線程不能是一個Android Media Player,因為我很好地構造了MediaPlayer。 同樣,在這里, Android MediaPlayer無法播放mp3文件並沒有解決我的問題,因為我將MediaPlayer構造得很好,並且在我第一次啟動該應用程序時就播放了聲音。

有人看到此代碼有問題嗎?

首先,不要在使用MediaPlayer.create()創建的MediaPlayer上調用prepareAsync() ,因為prepare()會為您處理。

從文檔:

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

MediaPlayer.onCreate()...

為給定資源ID創建MediaPlayer的便捷方法。 成功后,將已經調用prepare(),並且不能再次調用。

由於要在onPause()釋放MediaPlayer ,因此,如果要在onResume()再次播放,則必須使用MediaPlayer.onCreate()創建一個新的MediaPlayer

我建議您不要在onPause()釋放MediaPlayer,而是調用mP.pause()而不是mP.stop() ,然后不必擔心在onResume()重新創建/准備MediaPlayer

這是一個例子:

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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM