2017年9月9日更新目前项目中继续使用了原生MediaPlayer

不知道有多少人在做Android音频开发,但是假如有人想使用Android原生的MediaPlayer做音频,我劝你还是放弃这条路吧,这个MediaPlayer类效果并不理想,会带来很多bug
项目发生了什么?
在产品上线前期有用户反馈说是听书听了15分钟就会自动停止,当时测试6.0以下手机没问题,以为是该用户手机问题没有理睬,中期用户人数越来越多,越来越多的用户反馈了这一问题才有所警觉,亲身测试发现真的——6.0及以上版本的手机后台播放音频15分钟左右就会停止。
第一次尝试解决
我采用的是MediaPlay类在Activity中播放音频,播放15分钟左右停止,我以为是系统休眠杀死了进程,所以采取的是“使用Service后台播放音频”“使用唤醒锁+显示通知栏+设置前台进程”来防止进程被杀死并且能够使用CPU继续运行,但是!!!进程没有被杀死,Service还是一直存在,但是就是不播放了。
第二次尝试解决
排除了系统休眠进程这方面的原因,我把关注点放在了MediaPlayer类上,开始重写MediaPlayer类的方法(onError,onComplete,onBuffer….等等回调方法,结果发现了新的进展!!!)onBufferListener方法是返回缓冲整个音频的百分比,结果发现!!这个百分比返回值一直是61,这也就意味着根本这个音频就无法缓冲完毕,但是为什么6.0以下系统可以完整播放呢?我百度了很多资料无果,专门去StackFlow提问无果,最后也没有得到科学的解释,但是根据自己的测试结果大致总结了这个bug的来历:

6.0以后系统关于音频缓存有了新的改动,缓冲的时候遇到噪点一般会在临界值终止缓冲,6.0开始,这个临界值变低了,而MediaPlayer类如果被终止了一次缓冲就不会自行继续缓冲,一直停留在该缓冲点

这个结论只是我的一个猜想,如果大家周围有Android大神可以给我科普一下这个问题的本质,免得我胡思乱想,在这里不胜感激。
第三次尝试解决
既然谷歌原生的MediaPlayer不给力,那么我们找第三方播放库(vitamio),这个播放库很方便,使用起来其实和MediaPlayer类完全一样,这个库能够提高噪点临界值,自行缓冲,即使遇到错误也会继续缓冲,所以这次在界面锁屏是可以听完,但是在后台播放就会被杀死进程,听不完整。
第四次尝试
现在问题似乎回到了第一个进程不被杀死的问题,虽然网上百度了很多方法来防止进程被杀死,但是你想想那些方法都很老了。你都能想到,谷歌能不防范吗?所以很多方法都被谷歌屏蔽了,然后不断摸索出一个:设置所锁屏界面,如果你在后台听音频,那么你锁屏解锁之后将直接跳转到听音频界面,这个问题最终解决啦
总结
1 天无绝人之路,如果你觉得路没了,不妨考虑退路(换个框架,别迷信Google原生)
2 迈出脚的一步就是进步(比如我以为第一次就能解决问题但是解决不了,但是很幸运,第四次解决的时候用到了第一次的知识)
3 虽然我解决了这个顽疾,但是我还是没有女朋友…….

更多相关文章

  1. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  2. Android应用开发以及设计思想深度剖析(4)
  3. Android5.1.1源码 - zygote fork出的子进程如何权限降级
  4. Android下的Service的基本用法
  5. 游走Android系列之Service
  6. Android(安卓)开发中踩过的坑之八:多进程问题
  7. Android(安卓)SDK 安装(升级)失败(A folder failed to be rename
  8. Android初级教程理论知识(第六章广播接受者)
  9. 详解Android进程保活的方法

随机推荐

  1. 关于Android(安卓)Wifi NetworkId的一些
  2. Android(安卓)截图功能源码的分析
  3. Android(安卓)IME
  4. Android(安卓)O(8.0)后台service限制
  5. ADB常用命令汇总
  6. android使用AIDL实现跨进程通讯(IPC)
  7. Android——学习之旅:adb常用命令行
  8. Android开发者福利之--------Android(安
  9. Android消息推送的Androidpn实现方式:(一)下
  10. 将apk装入system/app