概述
所遇到的问题 1、音频播放完成后 播放完成监听回调
public void onCompletion(MediaPlayer mp) {}
方法走了两次。
2、点击再次重新播放时,报
IllegalStateException
错误。
3、销毁activity时依然报2中的错误。
首先贴出一个工具类的部分代码
//单例
public static VoiceMediaPlayer getInstance(){
if(instance==null){
synchronized (VoiceMediaPlayer.class){
if(instance==null){
instance=new VoiceMediaPlayer();
}
}
}
return instance;
}
//初始化
public void initMediaPlayer(){
if(mediaPlayer==null){
mediaPlayer=new MediaPlayer();
}
mediaPlayer.setVolume(1.0f,1.0f);
mediaPlayer.setLooping(false);
}
//停止播放
public void stopMediaPlayer(){
mediaPlayer.stop();
mediaPlayer.reset();
}
//播放
public void play(final String path, final MediaPlayer.OnCompletionListener listener, final MediaPlayer.OnPreparedListener preparedListener){
try{
//mediaPlayer.reset();
mediaPlayer.setDataSource(path);
mediaPlayer.prepareAsync();
mediaPlayer.setOnCompletionListener(listener);
mediaPlayer.setOnPreparedListener(preparedListener);
}catch (IOException e){
e.printStackTrace();
}
}
//销毁
public void destroyMediaPlayer(){
try{
if(mediaPlayer!=null){
mediaPlayer.stop();
//mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer=null;
}
}catch (Exception e){
e.printStackTrace();
}
}
首先第一个问题,播放完成怎么会调用两次回调方法呢?
那是我在回调方法onComletion中调用了停止播放的方法,上面代码可以看到里面调用了mediaPlayer.reset方法。
这个方法的的作用是重置MediaPlayer对象为刚刚创建的状态(我没有在源码中找到调用会触发播放完成的回调方法),
我们只能从字面意思上来分析,刚刚播放完成,就调用了reset方法,重置了刚刚的状态也就是播放完成的状态,从而再次
调用了播放完成的状态(一定要重点理解是刚刚,这里我不确定我的理解是否正确,若有错误,请指出加以改正,目前从
实践上证明是这样子的)。
第二个问题,播放完成点击重新播放为何会报错呢?原因还是我在第一问题的解决基础上,播放完成我没有再调用停止播放方法
,而在此调用播放走play播放的方法时候,mediaPlayer没有重置状态,还是这个reset()方法,总是它,于是需要在上述play
方法里面准备异步加载前调用一下reset方法。
第三个问题,其实还是这个reset方法,每次都是它,好烦它。
当activity销毁时,需要先把mediaPlayer释放掉,mediaplayer.release释放之前仍需要先重置mediaplayer的状态,调用reset方法。
后两个个问题都是在通过源码中得到解释,很简单,就不再赘述源码。
以上问题都是自己开发的时候不注意,用第三方的用的多,用原生自己写的时候就不那么严禁导致的,以此记录勉励自己,加油!
下一篇 音量焦点问题。
最后
以上就是长情热狗为你收集整理的简单的音频播放功能MediaPlayer使用中所遇到的坑。的全部内容,希望文章能够帮你解决简单的音频播放功能MediaPlayer使用中所遇到的坑。所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复