2012-03-07 94 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