![](/img/trans.png)
[英]if mediaplayer.pasue() is called before mediaplayer.start() , then music is not playing
[英]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.