作者:郭涵川


Mediaplayer是Android中最重要,同时也是最复杂的一个多媒体播放器,在Android应用程序的开发过程中,Mediaplayer是最常被使用到的技术之一。本文主要说明Mediaplayer在通过create方法获得资源时的问题阐述和解决方法。


使用Mediaplayer时,大家最常使用的获得资源的方法一般有两种,一种是通过setDataSource()方法,在该方法中通过添加文件路径来获得系统资源,相信大家对这种方式更加熟悉,但是本人在实现这种方法时总是会出现异常,无法找到资源。经过很多次的尝试,并且结合在网上搜索的各种解决方案,最后还是没能解决这个问题。所以,本人选择了一个不太好的方式:逃避(拍砖请轻拍)。因为我相信Mediaplayer会提供其他获得资源的方式。


经过简单的搜索,很容易的就发现了在Mediaplayer中提供了create()方法,在该方法中,我们只需将目标文件放在项目资源文件的某个目录下,就可以轻松的找到。 (当然,这里也是可以使用URL路径寻找目标文件的,不过本人比较懒,所以没有尝试这种方法。)





然后,我就很高兴的调用prepare()和start()方法,运行了模拟器,聆听美妙的音乐。不过就在我以为万事OK的时候,在Log里面发现了让我无奈的prepareAsync异常:





顾名思义,这是一个同步异常,所以经过简单的思考,以及在网上搜索结果,容易得到一种简单的解决方法:在使用之前先判断一下是否已经有对象在运行,如果有先将其停止,然后重新运行。




这种方法已经能将这个问题解决,不过我还是觉得心有不甘,为什么在运行的时候会出现这种问题呢?显然是在prepare()方法之前,就已经调用过了prepare()方法才会有这种问题,但是在prepare()前面只有create()一个方法涉及到了Mediaplayer对象。(之前看过的setDataSource()源码,对我产生了误导作用。导致我没有直接去看create()方法的源码,本人以为他们的实现方法应该是一致的。)

也是机缘巧合,无意中,我看了一下create()方法的源码,恍然大悟。



请注意红色标出的部分,我相信大家应该都会明白了,之所以会产生异常,是因为在create()方法中,已经对Mediaplayer对象调用过了prepare()方法,所以再次调用就会发生异常。


那么就会产生第二种解决方案,就是直接把那句折磨人的Mediaplayer.prepare()方法去掉!真是大快人心!现在我们就可以安心的聆听音乐无需烦恼、无需忧愁了。



更多相关文章

  1. android sharedpreference保存boolean,int,float,long,String和图片
  2. Android程序开发通过HttpURLConnection上传文件到服务器
  3. android studio jks和eclipse keystore
  4. Android(安卓)自定义View - 网络加载 ProgressBar 加载与隐藏
  5. Android进程系列第三篇---SystemServer进程的创建流程
  6. Android系统根目录结构及说明
  7. Android应用程序开发以及背后的设计思想深度剖析
  8. 非android的平台获取apk信息
  9. Android实习第九至十八天——碎碎念汇总

随机推荐

  1. 半年21项全新发布和升级,百度飞桨团队「码
  2. DeepMind星际争霸AI登上Nature,超越99.8%活
  3. 在图像生成领域里,GAN这一大家族是如何生
  4. 顶会抄顶会:SIGIR 2019论文被爆抄袭,部分内
  5. ECC内存与普通内存之间的区别
  6. Shell 流程控制
  7. VB.NET和Python有什么不同?前景分析!
  8. 如何提取视频声音,将视频中的音乐提取出来
  9. 【金三银四】Java中间件面试题(2021最新版
  10. Scikit-learn的六大功能!Python学习