Android MediaPlayer类详解
Android的多媒体框架支持各类常见的多媒体类型,这样在程序中能够很容易地集成音频、视频或者图片。Android下对于音频或者视频的支持均须要使用到MediaPlayer类html
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使用注意事项
- 在使用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();
}
});
- 使用完MediaPlayer须要回收资源。MediaPlayer是很消耗系统资源的,因此在使用完MediaPlayer,不要等待系统自动回收,最好是主动回收资源。
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
- 对于单曲循环之类的操做,除了能够使用setLooping()方法进行设置以外,还能够为MediaPlayer注册回调函数,MediaPlayer.setOnCompletionListener(),它会在MediaPlayer播放完毕被回调。
// 设置循环播放
// mediaPlayer.setLooping(true);
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// 在播放完毕被回调
play();
}
});
- 由于MediaPlayer一直操做的是一个流媒体,因此无可避免的可能一段流媒体资源,前半段能够正常播放,而中间一段由于解析或者源文件错误等问题,形成中间一段没法播放问题,须要咱们处理这个错误,不然会影响Ux(用户体验)。能够为MediaPlayer注册回调函数setOnErrorListener()来设置出错以后的解决办法,通常从新播放或者播放下一个流媒体便可。