MediaPlayer

Android MediaPlayer类详解

 

Android的多媒体框架支持各类常见的多媒体类型,这样在程序中能够很容易地集成音频、视频或者图片。Android下对于音频或者视频的支持均须要使用到MediaPlayerhtml

MediaPlayer处于Android多媒体包下"android.media.MediaPlayer",仅有一个无参的构造函数,虽然Android平台仅为咱们提供了一个无参的构造函数,可是为了方便咱们初始化,还为咱们提供了几个静态的create()方法用于完成MediaPlayer初始化的工做。(经常使用的两个)android

  • static MediaPlayer create(Context context,int resid):经过给定的Id来建立一个MediaPlayer实例。
  • static MediaPlayer create(Context context,Uri uri):经过给定的Uri来建立一个MediaPlayer实例。
    还有一些重载的create方法,请自行查看API

MediaPlayer具体方法介绍:数组

  • void setDataSource(String path) 经过一个具体的路径来设置MediaPlayer的数据源,path能够是本地的一个路径,也能够是一个网络路径
  • void setDataSource(Context context, Uri uri) 经过给定的Uri来设置MediaPlayer的数据源,这里的Uri能够是网络路径或是一个ContentProvider的Uri。
  • void setDataSource(MediaDataSource dataSource) 经过提供的MediaDataSource来设置数据源
  • void setDataSource(FileDescriptor fd) 经过文件描述符FileDescriptor来设置数据源
  • int getCurrentPosition() 获取当前播放的位置
  • int getAudioSessionId() 返回音频的session ID
  • int getDuration() 获得文件的时间
  • TrackInfo[] getTrackInfo() 返回一个track信息的数组
  • boolean isLooping () 是否循环播放
  • boolean isPlaying() 是否正在播放
  • void pause () 暂停
  • void start () 开始
  • void stop () 中止
  • void prepare() 同步的方式装载流媒体文件。
  • void prepareAsync() 异步的方式装载流媒体文件。
  • void reset() 重置MediaPlayer至未初始化状态。
  • void release () 回收流媒体资源。
  • void seekTo(int msec) 指定播放的位置(以毫秒为单位的时间)
  • void setAudioStreamType(int streamtype) 指定流媒体类型
  • void setLooping(boolean looping) 设置是否单曲循环
  • void setNextMediaPlayer(MediaPlayer next) 当 当前这个MediaPlayer播放完毕后,MediaPlayer next开始播放
  • void setWakeMode(Context context, int mode):设置CPU唤醒的状态。
  • **setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener) 网络流媒体的缓冲变化时回调 **
  • setOnCompletionListener(MediaPlayer.OnCompletionListener listener) 网络流媒体播放结束时回调
  • **setOnErrorListener(MediaPlayer.OnErrorListener listener) 发生错误时回调 **
  • setOnPreparedListener(MediaPlayer.OnPreparedListener listener):当装载流媒体完毕的时候回调。

在使用MediaPlayer播放一段流媒体的时候,须要使用prepare()或prepareAsync()方法把流媒体装载进MediaPlayer,才能够调用start()方法播放流媒体。
 setAudioStreamType()方法用于指定播放流媒体的类型,它传递的是一个int类型的数据,均以常量定义在AudioManager类中, 通常咱们播放音频文件,设置为AudioManager.STREAM_MUSIC便可。
网络

MediaPlayer使用注意事项

  1. 在使用start()播放流媒体以前,须要装载流媒体资源。这里最好使用prepareAsync()用异步的方式装载流媒体资源。由于流媒体资源的装载是会消耗系统资源的,在一些硬件不理想的设备上,若是使用prepare()同步的方式装载资源,可能会形成UI界面的卡顿,这是很是影响用于体验的。由于推荐使用异步装载的方式,为了不尚未装载完成就调用start()而报错的问题,须要绑定MediaPlayer.setOnPreparedListener()事件,它将在异步装载完成以后回调。异步装载还有一个好处就是避免装载超时引起ANR((Application Not Responding)错误。
mediaPlayer = new MediaPlayer();
                mediaPlayer.setDataSource(path);
                mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                
                // 经过异步的方式装载媒体资源
                mediaPlayer.prepareAsync();
                mediaPlayer.setOnPreparedListener(new OnPreparedListener() {                    
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        // 装载完毕回调
                        mediaPlayer.start();
                    }
                });
  1. 使用完MediaPlayer须要回收资源。MediaPlayer是很消耗系统资源的,因此在使用完MediaPlayer,不要等待系统自动回收,最好是主动回收资源。
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
            mediaPlayer.release();
            mediaPlayer = null;
        }
  1. 对于单曲循环之类的操做,除了能够使用setLooping()方法进行设置以外,还能够为MediaPlayer注册回调函数,MediaPlayer.setOnCompletionListener(),它会在MediaPlayer播放完毕被回调。
// 设置循环播放
//                mediaPlayer.setLooping(true);
                mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        // 在播放完毕被回调
                        play();                        
                    }
                });
  1. 由于MediaPlayer一直操做的是一个流媒体,因此无可避免的可能一段流媒体资源,前半段能够正常播放,而中间一段由于解析或者源文件错误等问题,形成中间一段没法播放问题,须要咱们处理这个错误,不然会影响Ux(用户体验)。能够为MediaPlayer注册回调函数setOnErrorListener()来设置出错以后的解决办法,通常从新播放或者播放下一个流媒体便可。
相关文章
相关标签/搜索