2010-02-21 60 views
0

我的代碼嘗試從res/raw播放MP3文件。MediaPlayer出現無法解釋的錯誤

代碼:

FileDescriptor fd = appContext.getResources().openRawResourceFd(R.raw.ringtone) 
        .getFileDescriptor(); 
player = new MediaPlayer(); 
      try 
      { 
       player.setAudioStreamType(AudioManager.STREAM_RING); 
       player.setDataSource(fd); 
       player.prepare();   
      } 
      catch (IllegalArgumentException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       player = null; 
       return; 
      } 
      catch (IllegalStateException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       player = null; 
       return; 
      } 
      catch (IOException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       player = null; 
       return; 
      } 

      player.setLooping(true); 
      player.start(); 

日誌顯示:

02-21 15:18:18.360:ERROR/PlayerDriver(51):命令PLAYER_SET_DATA_SOURCE完成了錯誤或信息PVMFErrNotSupported 02-21 15:18:18.380:ERROR/MediaPlayer的(693):錯誤(1,-4) 02-21 15:18:18.390:WARN/PlayerDriver(51):PVMFInfoErrorHandlingComplete

player.prepare後()被調用。

我真的沒有提示。 我不會使用MediaPlayer.create(),因爲我需要player.setAudioStreamType(AudioManager.STREAM_RING);

將不勝感激任何幫助......

+0

你嘗試用不同的文件? – Macarse 2010-02-21 14:02:55

+0

我可以使用MediaPlayer.create()播放同一個文件,所以我知道這不是格式問題。 – 2010-02-21 14:36:24

回答

3

MediaPlayer API docs

MediaPlayer對象就是 使用新的或創建reset() 之後被調用,它是在空閒狀態; 和release()之後被調用,它是 中的結束狀態。這兩個 之間的狀態是 MediaPlayer對象的生命週期。

它是一種編程錯誤到 調用方法諸如 getCurrentPosition()...setAudioStreamType(int)在空閒 狀態。

您應該研究MediaPlayer生命週期圖並提供相關示例並重寫您的代碼。在這種情況下,您看到您需要致電setDataSource()之前setAudioStreamType()

alt text


旁註:在Android中,你真的需要遵循的生命週期事件爲你做的一切,否則你會得到咬傷。你可以編寫不正確的代碼,直到運行時纔會知道,或者更糟糕的是,你可能會編寫你認爲可行的代碼,只有在奇怪的情況下才會發現它不會......例如,在這種情況下屏幕方向改變和回調方法是不一樣的,或者其他類似的情況(主頁按鈕...等)。

+0

謝謝,但: 1。沒有關於調用setAudioStreamType()的正確生命週期狀態的文檔。 2.我試過你說的已經和它給出了相同的錯誤... – 2010-02-21 14:25:51

+0

對不起,我的第一句話是不正確的,但它仍然不起作用:( – 2010-02-21 14:33:15