简单的音频播放功能MediaPlayer使用中所遇到的坑。

所遇到的问题 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方法。

 

后两个个问题都是在通过源码中得到解释,很简单,就不再赘述源码。

以上问题都是自己开发的时候不注意,用第三方的用的多,用原生自己写的时候就不那么严禁导致的,以此记录勉励自己,加油!

下一篇 音量焦点问题。

你可能感兴趣的:(android,android,日常总结)