您的位置:首页 > 移动开发 > Android开发

大神之路:重学Android——Android多媒体MediaPlayer

2016-09-09 01:18 281 查看
大神之路:重学Android——Android多媒体MediaPlayer
引言
最近发现Android开发中使用的知识越来越不得心应手了,有好多的API方法都记得不太清楚了,所以打算重新学习一遍,今天正好项目中有音乐播放的需求,回想一下Android多媒体的相关的知识,但是在开发中怎么也想不起来了,个人很讨厌这种模棱两可的感觉,期待行云流水一般的编码能力。所以决定要重新学习Android相关的知识。 正好借着项目的机会把Android多媒体重新学习一遍。
MediaPlayer介绍
Android多媒体中的MediaPlayer,我们可以通过这个API来播放音频和视频。通过该MediaPlayer中的一个重要组件。通过该类,我们可以以最方便的步骤来实现音视频的播放。
MediaPlayer支持的媒体来源:
内部的URL 可以通过ContentResolver来获取
外部的URL 以流的形式
对于Android所支持的媒体格式列表
相关方法详解
获得MediaPlayer实例: 可以直接new 或者调用create方法创建
  MediaPlayer mp = new MediaPlayer()
  MediaPlayer mp = MediaPlayer.create(this,R.raw.test);

另外create还有另一种的形式:
  create(Context context,Uri uri,SurfaceHolder holder)

通过Uri和指定SurfaceHolder,创建一个多媒体播放器
tips:如果创建MediaPlayer如果使用create方法,第一次启动前不需要再调用prepare(),如果是使用构造方法构造的话,则需要调用一次prepare()方法
设置播放文件:
 //raw下的资源
MediaPlayer.create(this,R.raw.test);
//本地文件路径
mp.setDataSource("/sdcard/test.mp3");
//网络URL文件
mp.setDataSource("http://www.xxx.com/music/test.mp3");

其他方法
getCurrentPosition(): 得到当前的播放位置
getDuration():得到文件的时间
getVideoHeight() 得到视频高度
getVideoWidth() 得到视频宽度
isLooping():是否循环播放
isPlaying():是否正在播放
pause():暂停
prepare():准备(同步)
prepareAsync():准备(异步)
relase():释放MediaPlayer对象
reset():重置MediaPlayer对象
seekTo(int msec):指定播放的位置(以毫秒为单位的时间)
setAudiostreamType(int streamtype) 指定流媒体的类型
setDisplay(SurfaceHolder sh):设置用SurfaceHolder来显示多媒体
setLooping(boolean looping)设置是否循环播放
setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener):网络流媒体的缓冲监听
setOnCompletionListener(MediaPlayer.OnCompletionListener listener): 网络流媒体播放结束监听
setOnErrorListener(MediaPlayer.OnErrorListener listener): 设置错误信息监听
setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener) 视频尺寸监听
setScrennOnWhilePlaying(boolean screenOn):设置是否使用SurfaceHolder显示
setVolume(float leftVolume,float rightVolume)设置音量
start():开始播放
stop():停止播放

官方文档中,从其他两种途径音频的实例
内部URL:
  Uri uri =
  MediaPlayer mediaplyer = new MediaPlayer();
  mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
  mediaPlayer.setDataSource(getApplicationContext(),myUri);
  mediaPlayer.prepare();
  mediaPlayer.start();

外部URL:
  String url = "http://.....";
  MediaPlayer mediaPlayer = new MediaPlayer();
  mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
  mediaPlayer.setDataSource(url);
  mediaPlayer.prepare();
  mediaPlayer.start();

Note:假假如你通过一个URL以流的形式播放在线音频文件,该文件必须可以进行渐进式下载
状态



解释:
MediaPlayer对象被刚刚用new操作符创建或是调用了reset()方法后,它就处于Idle状态。当调用了release()方法后,它就处于End状态。这两种状态MediaPlaer对象的生命周期
在一个新构建的MediaPlayer对象和一个调用了reset()方法的MediaPlayer对象的差别。在处于Idle状态时,调用getCurrentPosition(), getDuration(), getVideoHeight(), getVideoWidth(), setAudioStreamType(int), setLooping(boolean), setVolume(float, float), pause(), start(),
stop(), seekTo(int), prepare() 或者 prepareAsync() 方法都是编程错误。当一个MediaPlayer被重建的时候,内部的播放引擎和对象的状态都没有改变,这个时候调用以上的方法,框架将无法回调客户端程序注册的OnErrorListener()方法;但若这个MediaPlayer对象调用reset()方法之后,再调用以上的那些方法,内部播放引擎就会回调客户端程序注册的OnErrorListener.onError()方法,并将错误状态传入。
一旦一个MediaPlayer对象不再被使用,应立即调用release()方法来释放在内部播放引擎中与这个MediaPlayer对象关联的资源,调用 release()后,播放器会进入end状态,一旦MediaPlayer对象进入End状态,它不能再被使用,也没有办法再迁移到其它状态
由于某些原因MediaPlayer会发生错误,一旦发生错误,MediaPlayer对象会进入到Error状态,此时可调用reset()方法来把这个对象恢复成Idle状态
调用setDataSource(FileDescriptor)方法,或setDataSource()方法,会使处于Idel状态的MediaPlayer的对象迁移到Initialized状态
当MediaPlayer处于其它状态下,调用setDataSource()方法,会抛出异常
在开始播放之前,MediaPlayer对象必须要进入Prepared状态
在不合适的状态下调用prepare()和prepareAsync()方法会抛出异常,当MediaPlayer对象处于Prepared状态的时候,可以调整音频/视频的属性,如音量,播放时是否一直亮屏,循环播放等。
要开始播放,必须调用start()方法,当方法返回时,MediaPlayer的对象处于Started状态。
播放可以被暂停,停止,以及调整当前播放的位置,当调用pause()方法并返回时,会使MediaPlayer对象进入Paused状态。started与paused状态的互相转换在内部的播放引擎中是异步的。
调用start()方法会让一个处于Paused状态的MediaPlayer对象从之前暂停的地方恢复播放。调用start()方法返回后,MediaPlayer对象的状态会变成Started状态
调用stop()会停止播放,会让MediaPlayer进入Stopped状态
当播放到流的末尾,播放就完成了
如果没有开启循环模式,那么内部的播放引擎会调用客户端提供的OnCompletion.onCompletion()回调方法,内部引擎一旦调用了onCompletion()回调方法说明这个MediaPlayer对象进入了PlaybackCompleted状态
当处于PlaybackCompleted状态的时候,可以再调用start()方法来让这个MediaPlayer对象再进入Started状态
  在停止播放的是代码应这样写才可以在下次播放时重新开始播放 

      private void stop(){ 
  if(mediaplayer!=null){//mediaplayer 是M    ediaPlayer的 instance 
  mediaplayer.stop(); 
      try{ 
      mediaplayer.prepare();//stop后下次重新播放要首先进入    prepared状态 
      mediaplayer.seekTo(0);//须将播放时间设置到0;这样才能在下次播放是重新开始,否则会继续上次播放 
      }catch(IOException e){ 
      e.printStackTrace(); 
  } 
  }   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android知识点