Android:媒体播放器因未处理的事件而消失

Posted

技术标签:

【中文标题】Android:媒体播放器因未处理的事件而消失【英文标题】:Android: mediaplayer went away with unhandled events 【发布时间】:2012-03-25 10:52:31 【问题描述】:

我需要获取需要从应用播放的一系列语音通知的音频文件的持续时间。我已将音频文件添加为资源,它们播放得很好。下面的示例代码实际上非常适合其预期目的:它确实返回了音频文件的持续时间。

代码如下:

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;

这是奇怪的事情。此代码在为给定测试准备音频指令集的 Main 活动中调用。此活动中没有错误。但是一旦调用了第二个活动,我就会在 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>

我已经单步执行到 Main 活动的末尾(没有错误)和 Second 活动的第一行。活动之间肯定会引发错误。 此外,如果我注释掉 try 块的八行(因此只返回零),则可以避免 logcat 错误。当我恢复八行时,错误又回来了。 我浏览了文档并搜索了网络,我相信我正确地构造、释放和销毁了 mediaplayer 对象,所以我不明白为什么我会出错。 也就是说,我一定做错了什么。有什么想法吗?

谢谢,

凯文

【问题讨论】:

【参考方案1】:

只需将mp.reset(); 放在mp.release(); 之前。

【讨论】:

mp.stop(); mp.reset(); mp.release(); mp = null; 没有为我修好。 这样做是将 MediaPlayer 重置为未初始化状态; documentation。这样您就可以明确丢弃任何未处理的事件,并且在销毁对象时不会显示警告。我不确定为什么release() 不处理这个问题。【参考方案2】:

五圣:

    if(mp!=null) 
        if(mp.isPlaying())
            mp.stop();
        mp.reset();
        mp.release();
        mp=null;
    

【讨论】:

对于任何使用 VideoView 的人来说,这类似于它在 stopPlayback(); 中所做的事情 @vvolkgang 除了stopPlayback() 不调用reset()

以上是关于Android:媒体播放器因未处理的事件而消失的主要内容,如果未能解决你的问题,请参考以下文章

Android TV 模拟器无法识别媒体键事件

Android接收蓝牙多媒体按键事件的bug

如何在android中运行媒体扫描仪

服务器媒体事件和信号处理

服务器媒体事件和信号处理

未处理的 IO 异常?使用媒体播放器播放 mp3 文件 - Android