Android MediaPlayer最终定稿,未发布

Android MediaPlayer最终定稿,未发布,android,android-mediaplayer,Android,Android Mediaplayer,我的应用程序似乎工作正常,但我在未发布警告的情况下完成了MediaPlayer,我不知道为什么会收到警告。奇怪的是,它们只在我使用MediaPlayer.create(ctxt,resid)播放资源文件(.ogg)时出现,而在我使用setDataSource(path)播放SD卡上的文件时不出现 我看了很多其他关于堆栈溢出的文章,查看了开发人员文档,并尝试了不同的组合(太多了,无法列出),但似乎没有什么能消除错误。我不确定是虫子还是我在做什么 我使用的是带有FragmentStatePagerA

我的应用程序似乎工作正常,但我在未发布警告的情况下完成了MediaPlayer,我不知道为什么会收到警告。奇怪的是,它们只在我使用
MediaPlayer.create(ctxt,resid)
播放资源文件(.ogg)时出现,而在我使用
setDataSource(path)
播放SD卡上的文件时不出现

我看了很多其他关于堆栈溢出的文章,查看了开发人员文档,并尝试了不同的组合(太多了,无法列出),但似乎没有什么能消除错误。我不确定是虫子还是我在做什么

我使用的是带有FragmentStatePagerAdapter的ViewPager,基本上,当你点击页面时,它会播放声音。当您滑动到下一页时,声音停止播放(如果仍在播放)。这是该部分的代码,但我在测试期间删除了它,它似乎没有什么区别,但我想我应该包括它以防万一:

public void stopAudioInFragment(){
ViewPageFragment页面=(ViewPageFragment)
getSupportFragmentManager().findFragmentById(R.id.pager);
如果(第页!=null){
page.stopAudio();
}
}
以下是片段的相关代码:

publicstaticmediaplayer;
毛迪奥德私人酒店;
private boolean mIsAudioFile=false;
公共播放音频(){
//设置媒体播放器以播放音频
错误音频文件=错误;
停止音频();
mPlayer=新媒体播放器();
如果(!mIsAudioFile&&maudoid!=-1&&mPlayer!=null){
//播放本地资源音频
mPlayer=MediaPlayer.create(mContext,mAudioId);
mPlayer.setOnCompletionListener(新的OnCompletionListener(){
完成时的公共作废(MediaPlayer mp){
停止音频();
}
});
}else if(maudoid!=-1&&mPlayer!=null){
//在SD卡上播放音频文件
试一试{
mPlayer.setDataSource(音频文件路径);
mPlayer.setOnCompletionListener(新的OnCompletionListener(){
完成时的公共作废(MediaPlayer mp){
停止音频();
}
});
}捕获(IllegalArgumentException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(安全异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(非法状态){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
试一试{
mPlayer.prepare();
}捕获(非法状态){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
mPlayer.start();
}
公共音频{
if(mPlayer!=null){
if(mPlayer.isPlaying()){
mPlayer.stop();
}
mPlayer.reset();//可能不是必需的,因为release()是在紧接着调用的,但它似乎不会造成问题
mPlayer.release();
mPlayer=null;
}
}
@凌驾
公共空间{
停止音频();
super.ondestory();
}
同样,上面的方法很好,似乎不会引起任何问题。如果我在一个页面上,点击几次,它就会开始播放声音,然后每次新点击都会停止/播放。当它破坏页面,然后GC运行时,会出现警告。每次我播放音频文件都会有一个警告

我想知道为什么只有当MediaPlayer播放资源文件时,而不是从SD卡播放文件时,
MediaPlayer才最终定稿而没有发布
警告。据我所知,它应该总是在GC'd之前完成。有什么想法吗

更新:我又做了一些测试,试图确定是否有什么“奇怪”的地方,但我唯一能看到的是,它只会影响res/raw文件夹中的文件。以下是我可以补充的内容:

  • 生成警告的文件位于res/raw文件夹中
  • 如果我将文件(.ogg和.wav)移动到assets文件夹并从那里播放它们, MediaPlayer不会生成任何警告
  • 我用.mp3、.wav和.mp4替换了res/raw中的一些文件 音频文件和它们都会生成警告,就像原来的一样 .ogg文件没有
  • 我成功地播放了SD卡中的.mp3、.wav和.mp4文件,但它们没有播放 生成MediaPlayer警告
  • 澄清:所有文件都能正确播放,不会出现任何问题 用户视角。我想弄明白的是为什么 MediaPlayer为res/raw格式的音频文件生成警告

看起来问题与MediaPlayer如何处理res/raw文件夹中的资源有关,但我不知道“问题”是什么,也不知道它为什么会生成MediaPlayer警告。

在不使用时释放media player by
mp.Release()。
它会解决你的问题

例如

mp.setOnCompletionListener(new OnCompletionListener() {
    public void onCompletion(MediaPlayer mp) {    
        mp.release();
    }
});

是否有理由调用reset然后release,我很确定您只想使用release?对于不同的设备,这将以不同的方式工作,因为媒体播放器只是本机OEM的包装,本机服务都依赖于设备。同样的道理也适用于照相机。即使修复托管代码以删除这些警告,它们也可能出现在另一个服务器上device@RSenApps谢谢你的评论。我想说,如果我只是调用release()而以前没有调用reset(),我曾经遇到过一些问题,但我不记得了。在任何情况下,我认为在release()之前调用reset()都没有坏处,因为reset()将MediaPlayer设置为未初始化状态,release()将释放资源