一、使用方法

MediaPlayer可以播放以下资源:

1、Local resources

2、Internal URIs, such as one you might obtain from a Content Resolver

3、External URLs (streaming)

示例代码如下:

1、播放res/raw下的视频(代码摘自:http://wear.techbrood.com/guide/topics/media/mediaplayer.html):

MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer
.start(); // no need to call prepare(); create() does that for you
2、播放Uri格式的文件(代码摘自:http://wear.techbrood.com/guide/topics/media/mediaplayer.html)

Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer
.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer
.setDataSource(getApplicationContext(), myUri);
mediaPlayer
.prepare();
mediaPlayer
.start();
3、播放Url的文件(代码摘自:http://wear.techbrood.com/guide/topics/media/mediaplayer.html)

String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer
.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer
.setDataSource(url);
mediaPlayer
.prepare(); // might take long! (for buffering, etc)
mediaPlayer
.start();

可以看到,播放uri和url的方式基本一样,区别在于setDataSource调用的方法不同。其实,播放res/raw的视频文件也可以采用uri的方式,

uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.video);

然后就可以使用上面的第二种方式播放。

至此,MediaPlayer已经初始化完毕,但还有以下问题需要解决:给它设置播放界面(SurfaceView),prepare需要异步调用(prepareAsync()),播放状态管理,释放播放器。以下章节会介绍。

二、设置显示界面(SurfaceView)

需要在SurfaceView创建完毕的时候才能设置。所以,如果你的SurfaceView已经创建完毕,可以直接调用mediaPlayer.setDisplay(surfaceView.getHolder());如果需要调用一个新的界面来播放视频,这时候就要监听SurfaceView的回调事件,在surfaceCreate函数里调用setDisplay的方法。

示例代码如下(代码摘自:http://www.open-open.com/lib/view/open1341754267229.html):

surfaceView
= (SurfaceView)
this.findViewById(R.id.video_surface);
//给SurfaceView添加CallBack监听 holder
= surfaceView.getHolder();
mCallBack
= newSurfaceHolder.Callback(){
@Overridepublic
void
surfaceChanged(SurfaceHolder arg0,int
arg1,
int
arg2,
int
arg3) {
// 当Surface尺寸等参数改变时触发Log.v("Surface Change:::","surfaceChanged called");}@Overridepublic
void
surfaceCreated(SurfaceHolder holder) {
// 当SurfaceView中的Surface被创建的时候被调用//在这里我们指定MediaPlayer在当前的Surface中进行播放player.setDisplay(holder);//在指定了MediaPlayer播放的容器后,我们就可以使用prepare或者prepareAsync来准备播放了player.prepareAsync();}@Overridepublic
void
surfaceDestroyed(SurfaceHolder holder) {
Log.v("Surface Destory:::","surfaceDestroyed called");}
} holder.addCallback(mCallBack); //为了可以播放视频或者使用Camera预览,我们需要指定其Buffer类型 holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

三、异步prepare

由于在UI线程调用prepare()可能会导致ANR,所以,最好要使用异步调用prepare的方法,然后再监听prepare,在prepare完成的时候,再调用mediaPlay的start方法。

调用方法如下(代码摘自:http://www.open-open.com/lib/view/open1341754267229.html):

mOnPreparedListener
= new
OnPreparedListener(){

@Override public
void
onPrepared(MediaPlayer player) {
// 当prepare完成后,该方法触发,在这里我们播放视频 //首先取得video的宽和高 vWidth = player.getVideoWidth(); vHeight = player.getVideoHeight(); if(vWidth > currDisplay.getWidth() || vHeight > currDisplay.getHeight()){ //如果video的宽或者高超出了当前屏幕的大小,则要进行缩放 float
wRatio = (
float)vWidth/(float)currDisplay.getWidth();
float
hRatio = (
float)vHeight/(float)currDisplay.getHeight();
//选择大的一个进行缩放 float
ratio = Math.max(wRatio, hRatio);
vWidth = (int)Math.ceil((float)vWidth/ratio); vHeight = (int)Math.ceil((float)vHeight/ratio); //设置surfaceView的布局参数 surfaceView.setLayoutParams(new
LinearLayout.LayoutParams(vWidth, vHeight));
//然后开始播放视频 player.start(); } }


mediaPlayer.setOnPreparedListener(mOnPreparedListener);


mediaPlayer.prepareAsync();

当然,meidaPlayer还有很多其它的监听方法,如视频尺寸变化,播放结束,播放出错等。具体参考官方文档或上面示例代码的出处也有解释。


四、状态管理

看官网的这张图:

meidiaPlayer有些函数的调用有状态限制。

五、释放mediaPlayer

在你不需要播放视频的时候,就需要释放掉资源,方法如下:

mediaPlayer.release();
mediaPlayer
= null;


更多相关文章

  1. studio更新时候,不小心点了ignore,无法更新的解决方法
  2. android之发送短信的方法研究
  3. SQLite的Android光标在方法调用时崩溃
  4. android 2D 游戏的开发的方法
  5. 在Skobbler中完成导航时,确定“街边”的最佳方法是什么?
  6. 【Camera】Android平台Camera实时滤镜实现方法
  7. Fragment的setUserVisibleHint方法实现视频音频播放暂停
  8. Android代码性能优化技巧
  9. Android-SDK-Manager 不能更新最有效的解决方法

随机推荐

  1. 丢失Android系统库或者Conversion to Dal
  2. WebView---Android与js交互实例
  3. Android4.2增加新键值
  4. android与js的交互
  5. android静默安装的实现(turn)
  6. Android培训班(38)
  7. flutter集成推送功能-小米推送集成
  8. Android requires compiler compliance l
  9. Android中的测试小demo
  10. 深入剖析ndk配置环境VS简易配置jni流程