简单的音频播放功能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方法。
后两个个问题都是在通过源码中得到解释,很简单,就不再赘述源码。
以上问题都是自己开发的时候不注意,用第三方的用的多,用原生自己写的时候就不那么严禁导致的,以此记录勉励自己,加油!
下一篇 音量焦点问题。
简单的音频播放功能MediaPlayer使用中所遇到的坑。相关推荐
- 安卓java音乐播放器下一曲_Android实现简单音乐播放器(MediaPlayer)
Android实现简单音乐播放器(MediaPlayer),供大家参考,具体内容如下 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个 ...
- 利用Service实现简单的音乐播放功能
1.本例利用Service实现简单的音乐播放功能,下面是效果图.(点击开始播放开启服务,音乐播放,点击"停止播放"关闭服务,音乐停止播放.) 2.核心代码: MusicServic ...
- android音乐播放器实现,Android实现简单音乐播放器(MediaPlayer)
Android实现简单音乐播放器(MediaPlayer),供大家参考,具体内容如下 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个 ...
- Android音频开发(五)如何存储和解析最简单的音频wav文件
我们大家都知道,无论是文字.图像还是声音,都必须以一定的格式来组织和存储起来,然后其它的软件再以相同的协议规则,相应的格式才能去打开解析这一段数据,例如,对于原始的图像数据,我们常见的格式有 YUV. ...
- Unity 进阶 之 实现简单的音频可视化封装(包括音频和麦克风)
Unity 进阶 之 实现简单的音频可视化封装(包括音频和麦克 目录 Unity 进阶 之 实现简单的音频可视化封装(包括音频和麦克 一.简单介绍 二.实现原理 三.注意事项 四.效果预览 五.实现步 ...
- HTML5用audio标签做一个最简单的音频播放器
在做系统的时候,要求做一个音频播放器,就在网上查找了一些资料,发现这样的资料还是很千篇一律的,EasyUI框架并没有给我们一个音频播放器的功能,在bootstrap上有,但是也是结合html5来写的, ...
- 使用LM386的简单Arduino音频播放器和放大器
原文地址:https://circuitdigest.com/microcontroller-projects/arduino-audio-music-player 使用LM386的简单Arduino ...
- 利用 FFmpeg 进行简单的音频拼接 降噪 合成
** 利用 FFmpeg 进行简单的音频拼接 降噪 合成 ** 项目需要M4a 格式的音频拼接,由于 m4a 不能像 mp3 直接以流的方式进行拼接,所以简单学习了一下 FFmepeg .在这里分享一 ...
- 微信小程序 音频播放功能createInnerAudioContext
微信小程序 音频播放功能createInnerAudioContext 效果: 前端界面代码: <view class="cu-modal {{ModalName=='DialogMo ...
最新文章
- 为什么结构主机和全局编录服务器不能放在同一个域控制器上?
- ASP.NET自定义控件组件开发 第一章 第二篇 接着待续
- ACM模板--邻接矩阵 有向图 搜索算法
- 笔记-信息化与系统集成技术-区块链的特征
- boost::geometry::num_interior_rings用法的测试程序
- 12 哈希表相关类——Live555源码阅读(一)基本组件类
- 断点vue_vue 事件代理
- Linux 系统安装配置PHP服务(源码安装)
- asp.net三层架构制作新闻管理_为什么使用PHP制作网站?
- 提高电脑反应速度_大家都能看懂的电脑内存条挑选技巧,电脑的内存条就应该这样选!...
- Yolo训练自己的数据集,将json格式转换成txt文件格式
- oppo计算机找不到,oppo手机照片在电脑显示不出来怎么办啊
- 8个免费恶搞照片在线生成网站
- 【水哥RPA】配置水哥RPA环境变量报错的解决方法
- Cesium深入浅出之如何获取帧率
- Java 正则表达式 中的 任意字符
- matlab画立体星星教程,抖音星空画的人怎么画 制作教程完整视频步骤分享
- 传感网应用开发(环境部署)
- 医学图像处理和深度学习入门
- 算法课程设计:使用Python完成可视化的五子棋AI