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

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

引言

最近发现Android开发中使用的知识越来越不得心应手了,有好多的API方法都记得不太清楚了,所以打算重新学习一遍,今天正好项目中有音乐播放的需求,回想一下Android多媒体的相关的知识,但是在开发中怎么也想不起来了,个人很讨厌这种模棱两可的感觉,期待行云流水一般的编码能力。所以决定要重新学习Android相关的知识。 正好借着项目的机会把Android多媒体重新学习一遍。

MediaPlayer介绍

Android多媒体中的MediaPlayer,我们可以通过这个API来播放音频和视频。通过该MediaPlayer中的一个重要组件。通过该类,我们可以以最方便的步骤来实现音视频的播放。

MediaPlayer支持的媒体来源:

  • 内部的URL 可以通过ContentResolver来获取
  • 外部的URL 以流的形式
  • 对于Android所支持的媒体格式列表

相关方法详解

  1. 获得MediaPlayer实例: 可以直接new 或者调用create方法创建
      MediaPlayer mp = new MediaPlayer()
  2.   MediaPlayer mp = MediaPlayer.create(this,R.raw.test);
  3. 另外create还有另一种的形式:
      create(Context context,Uri uri,SurfaceHolder holder)

  4. 通过Uri和指定SurfaceHolder,创建一个多媒体播放器
  5. tips:如果创建MediaPlayer如果使用create方法,第一次启动前不需要再调用prepare(),如果是使用构造方法构造的话,则需要调用一次prepare()方法
  6. 设置播放文件:
     //raw下的资源
  7. MediaPlayer.create(this,R.raw.test);
  8. //本地文件路径
  9. mp.setDataSource("/sdcard/test.mp3");
  10. //网络URL文件
  11. mp.setDataSource("http://www.xxx.com/music/test.mp3");
  12. 其他方法
    • 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以流的形式播放在线音频文件,该文件必须可以进行渐进式下载

状态

大神之路:重学Android——Android多媒体MediaPlayer_第1张图片

解释:

  • 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知识点与系统机制)