android錯誤之MediaPlayer用法的Media Player called in state *
用到Media Player,遇到幾個問題,記一下
用法就不說了,使用的時候最好參考一下mediaPlayer的這張圖
第一個錯誤是Media Player called in state 8
這個是因為在調用start之前沒有prepare,因為我是用了
mediaPlayer = MediaPlayer.create(context, R.raw.notice);
去初始化的播放器,這個介面說明
只要成功返回了播放器就不需要再去prepare了,但是我之後多次調用stop和start,就導致出現上面錯誤,
對照圖上也可以看出來,如果在暫停時候使用多是stop,則在start之前必須重新prepare,否則報錯Media Player called in state 8
如果暫停使用pause,那麼直接start就可以,不用prepare。
第二個錯誤是Media Player called in state 0
這個錯誤是由於
public void play(){ try { mediaPlayer.prepare(); } catch (IllegalStateException e) { e.printStackTrace(); }
mediaPlayer.start();
}
改成下面這樣
public void play(){ try { mediaPlayer.setOnPreparedListener(preparedListener); mediaPlayer.prepareAsync(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } } OnPreparedListener preparedListener = new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mediaPlayer.start(); } };
一看就明白了,剛開始我調完prepare就直接去start了,但是這時候可能prepare還沒有成功,所以就報了上面的錯誤。
之後又遇到一個prepareAsync called in state 8
這個解決方案在之前那個基礎上加一行代碼,確保在prepare之前播放器已經stop了
public void play() {try {if(mediaPlayer !=null){mediaPlayer.stop();}mediaPlayer.setOnPreparedListener(preparedListener);mediaPlayer.prepareAsync();} catch (IllegalStateException e) {e.printStackTrace();}currentVolumn = am.getStreamVolume(AudioManager.STREAM_MUSIC);if (currentVolumn < maxVolumn) {am.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolumn, 0);}}