Android MediaPlayer 常用方法介绍

来源:互联网 发布:临沂软件开发培训 编辑:程序博客网 时间:2024/06/06 09:03

Android MediaPlayer 常用方法介绍 


方法:create(Context context, Uri uri) 
解释:静态方法,通过Uri创建一个多媒体播放器。 

方法:create(Context context, int resid) 
解释:静态方法,通过资源ID创建一个多媒体播放器 

方法:create(Context context, Uri uri, SurfaceHolder holder) 
解释:静态方法,通过Uri和指定 SurfaceHolder 【抽象类】 创建一个多媒体播放器 

方法: getCurrentPosition() 
解释:返回 Int, 得到当前播放位置 

方法: getDuration() 
解释:返回 Int,得到文件的时间 

方法:getVideoHeight() 
解释:返回 Int ,得到视频的高度 

方法:getVideoWidth() 
解释:返回 Int,得到视频的宽度 

方法:isLooping() 
解释:返回 boolean ,是否循环播放 

方法:isPlaying() 
解释:返回 boolean,是否正在播放 

方法:pause() 
解释:无返回值 ,暂停 

方法:prepare() 
解释:无返回值,准备同步 

方法:prepareAsync() 
解释:无返回值,准备异步 

方法:release() 
解释:无返回值,释放 MediaPlayer 对象 

方法:reset() 
解释:无返回值,重置 MediaPlayer 对象 

方法:seekTo(int msec) 
解释:无返回值,指定播放的位置(以毫秒为单位的时间) 

方法:setAudioStreamType(int streamtype) 
解释:无返回值,指定流媒体的类型 

方法:setDataSource(String path) 
解释:无返回值,设置多媒体数据来源【根据 路径】 

方法:setDataSource(FileDescriptor fd, long offset, long length) 
解释:无返回值,设置多媒体数据来源【根据 FileDescriptor】 

方法:setDataSource(FileDescriptor fd) 
解释:无返回值,设置多媒体数据来源【根据 FileDescriptor】 

方法:setDataSource(Context context, Uri uri) 
解释:无返回值,设置多媒体数据来源【根据 Uri】 

方法:setDisplay(SurfaceHolder sh) 
解释:无返回值,设置用 SurfaceHolder 来显示多媒体 

方法:setLooping(boolean looping) 
解释:无返回值,设置是否循环播放 

事件:setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener) 
解释:监听事件,网络流媒体的缓冲监听 

事件:setOnCompletionListener(MediaPlayer.OnCompletionListener listener) 
解释:监听事件,网络流媒体播放结束监听 

事件:setOnErrorListener(MediaPlayer.OnErrorListener listener) 
解释:监听事件,设置错误信息监听 

事件:setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener) 
解释:监听事件,视频尺寸监听 

方法:setScreenOnWhilePlaying(boolean screenOn) 
解释:无返回值,设置是否使用 SurfaceHolder 显示 

方法:setVolume(float leftVolume, float rightVolume) 
解释:无返回值,设置音量 

方法:start() 
解释:无返回值,开始播放 

方法:stop() 

解释:无返回值,停止播放


MediaPlayer使用技巧

  在使用MediaPlayer的使用过程中,有个小技巧需要说明一下:

  1、在使用start()播放流媒体之前,需要装载流媒体资源。这里最好使用prepareAsync()用异步的方式装载流媒体资源。因为流媒体资源的装载是会消耗系统资源的,在一些硬件不理想的设备上,如果使用prepare()同步的方式装载资源,可能会造成UI界面的卡顿,这是非常影响用于体验的。因为推荐使用异步装载的方式,为了避免还没有装载完成就调用start()而报错的问题,需要绑定MediaPlayer.setOnPreparedListener()事件,它将在异步装载完成之后回调。异步装载还有一个好处就是避免装载超时引发ANR((Application Not Responding)错误。

view sourceprint?
01.1                 mediaPlayer = new MediaPlayer();
02.2                 mediaPlayer.setDataSource(path);
03.3                 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
04.4                
05.5                 // 通过异步的方式装载媒体资源
06.6                 mediaPlayer.prepareAsync();
07.7                 mediaPlayer.setOnPreparedListener(new OnPreparedListener() {                   
08.8                     @Override
09.9                     public void onPrepared(MediaPlayer mp) {
10.10                         // 装载完毕回调
11.11                         mediaPlayer.start();
12.12                     }
13.13                 });

 2、使用完MediaPlayer需要回收资源。MediaPlayer是很消耗系统资源的,所以在使用完MediaPlayer,不要等待系统自动回收,最好是主动回收资源。

view sourceprint?
1.1         if (mediaPlayer != null && mediaPlayer.isPlaying()) {
2.2             mediaPlayer.stop();
3.3             mediaPlayer.release();
4.4             mediaPlayer = null;
5.5         }
 

  3、使用MediaPlayer最好使用一个Service来使用,并且在Service的onDestory()方法中回收MediaPlayer资源,实际上,就算是直接使用Activity承载MediaPlayer,也最好在销毁的时候判断一下MediaPlayer是否被回收,如果未被回收,回收其资源,因为底层调用的native方法,如果不销毁还是会在底层继续播放,而承载的组件已经被销毁了,这个时候就无法获取到这个MediaPlayer进而控制它。

view sourceprint?
01.1     @Override
02.2     protected void onDestroy() {
03.3         if (mediaPlayer != null && mediaPlayer.isPlaying()) {
04.4             mediaPlayer.stop();
05.5             mediaPlayer.release();
06.6             mediaPlayer = null;
07.7         }
08.8         super.onDestroy();
09.9     }
 

  4、对于单曲循环之类的操作,除了可以使用setLooping()方法进行设置之外,还可以为MediaPlayer注册回调函数,MediaPlayer.setOnCompletionListener(),它会在MediaPlayer播放完毕被回调。

view sourceprint?
01.1                 // 设置循环播放
02.2 //                mediaPlayer.setLooping(true);
03.3                 mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
04.4                    
05.5                     @Override
06.6                     public void onCompletion(MediaPlayer mp) {
07.7                         // 在播放完毕被回调
08.8                         play();                       
09.9                     }
10.10                 });
 

   5、因为MediaPlayer一直操作的是一个流媒体,所以无可避免的可能一段流媒体资源,前半段可以正常播放,而中间一段因为解析或者源文件错误等问题,造成中间一段无法播放问题,需要我们处理这个错误,否则会影响Ux(用户体验)。可以为MediaPlayer注册回调函数setOnErrorListener()来设置出错之后的解决办法,一般重新播放或者播放下一个流媒体即可。  

view sourceprint?
1.1                 mediaPlayer.setOnErrorListener(new OnErrorListener() {
2.2                    
3.3                     @Override
4.4                     public boolean onError(MediaPlayer mp, int what, int extra) {
5.5                         play();
6.6                         return false;
7.7                     }
8.8                 });

原创粉丝点击