2012-03-07 114 views
45

我需要獲取需要從應用播放的一系列語音通知的音頻文件的持續時間。我已經添加了音頻文件作爲資源,他們確實打得很好。下面的示例代碼實際上完美適用於其預期目的:它確實會返回音頻文件的持續時間。Android:mediaplayer帶走了未處理的事件

下面是代碼:

float getDurationOfAudioResource(LocationEnum loc, Context context){ 
    float duration = 0; 
    try { 
     MediaPlayer mp; 
     mp = MediaPlayer.create(context, getAudioResource(loc)); 
     duration = mp.getDuration(); 
     mp.release(); 
     mp = null; 
    } 
    catch (IllegalStateException e) {e.printStackTrace(); logError(25, "TestDescItem:Fault::Could not open mediaplayer object with audio resource.");} 
    return duration; 
} 

下面是奇怪的事情。該代碼在主要活動中調用,爲給定測試準備一組音頻指令。此活動中沒有錯誤。但是一旦第二個活動被調用,我就會在logcat上遇到很長的一串錯誤。

03-07 13:23:43.820: I/ActionLogger(21435): GenTest_Info_Test #0 successfully created. 
03-07 13:23:43.830: I/ActionLogger(21435): GenTest_Info_Test #1 successfully created. 
03-07 13:23:43.840: I/ActionLogger(21435): GenTest_Info_Test #2 successfully created. 
03-07 13:23:43.850: I/ActionLogger(21435): GenTest_Info_Test #3 successfully created. 
<snip> 
03-07 13:23:43.910: I/ActionLogger(21435): GenTest_Info_all tests successfully created. 
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events 
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events 
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events 
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events 
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events 
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events 
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events 
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events 
03-07 13:23:47.270: W/MediaPlayer(21435): mediaplayer went away with unhandled events 
<snip> 

我已經單步走到主要活動(沒有錯誤),並從第二個活動的第一行結束。這些錯誤肯定會在活動之間引發。另外,如果我將try塊的八行註釋掉(因此只返回零),logcat錯誤將被避免。當我恢復八條線路時,錯誤又回來了。 我已經通過文檔挖掘並搜索了網頁,我相信我正確構建,釋放和銷燬mediaplayer對象,所以我不明白爲什麼我會收到錯誤。這就是說,我一定在做錯事。有任何想法嗎?

感謝,

凱文

回答

160

只要把mp.reset();mp.release();之前。

+0

優秀。這解決了它!謝謝! – Hephaestus 2012-04-03 07:32:44

+9

這是做什麼的? – Casebash 2012-10-01 09:36:29

+4

版本會導致我的視​​頻視頻在IllegalStateException異常後崩潰... – Ron 2013-11-18 16:09:19

34

神聖五:

if(mp!=null) { 
     if(mp.isPlaying()) 
      mp.stop(); 
     mp.reset(); 
     mp.release(); 
     mp=null; 
    } 
+2

像魅力一樣工作 – locrizak 2015-06-25 06:51:13

+0

對於任何使用VideoView的人來說,它與'stopPlayback();' – vvolkgang 2016-05-19 12:04:42

相關問題