作者:刘昊昱
博客:http://blog.csdn.net/liuhaoyutz
在Android中,我们可以通过使用VideoView类或者MediaPlayer类来播放视频。
一、使用VideoView类播放视频
要使用VideoView类播放视频,首先要在布局文件中添加VideoView组件,然后在Activity中获取该组件,并使用VideoView.setVideoPath()或VideoView.setVideoURI()方法加载需要播放的视频,最后调用start()方法播放视频。VideoView类还提供了stop()和pause()方法,用于停止或暂停视频播放。
在布局文件中添加VideoView组件的基本语法格式如下:
<VideoView
属性列表>
</VideoView>
Android还提供了一个与VideoView组件结合使用的MediaController组件。MediaController组件用于通过图形控制界面来控制视频的播放。
下面我们来看一个使用VideoView和MediaController组件播放视频的例子,由于在模拟器上播放不了视频,所以这里就不上图了,我在真机上验证过可以播放视频,直接看代码:
先来看主布局文件main.xml,其内容如下:
<?xml version="1.0"encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <VideoView android:id="@+id/video" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> </LinearLayout>
下面看主Activity文件,其内容如下:
package com.liuhaoyu; import java.io.File; import android.app.Activity; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.os.Bundle; import android.widget.MediaController; import android.widget.Toast; import android.widget.VideoView; public classMainActivity extends Activity { private VideoView video; /** Called when the activity is firstcreated. */ @Override publicvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); video=(VideoView) findViewById(R.id.video); File file=new File("/sdcard/1.mp4"); MediaController mc=newMediaController(MainActivity.this); // 创建一个MediaController对象 if(file.exists()){ video.setVideoPath(file.getAbsolutePath()); video.setMediaController(mc); // 将VideoView与MediaController关联起来 video.requestFocus(); // 设置VideoView获取焦点 try { video.start(); // 播放视频 }catch(Exception e) { e.printStackTrace(); } // 设置VideoView的Completion事件监听器 video.setOnCompletionListener(new OnCompletionListener(){ @Override public voidonCompletion(MediaPlayer mp) { Toast.makeText(MainActivity.this, "视频播放完毕!", Toast.LENGTH_SHORT).show(); } }); }else{ Toast.makeText(this, "要播放的视频文件不存在", Toast.LENGTH_SHORT).show(); } } }
二、 使用MediaPlayer播放视频
MediaPlayer不但可以播放音乐,也可以播放视频,但是MediaPlayer没有提供视频输出界面,所以,用MediaPlayer播放视频需要和SurfaceView组件配合使用,其主要流程如下:
(1)、在布局文件中插入SurfaceView组件,其语法格式如下:
<SurfaceView
android:id=”@+id/ID号”
android:background=”背景”
android:keepScreenOn=”true|false”
android:layout_width=”宽度”
android:layout_height=”高度” />
(2)、创建MediaPlayer对象,并加载要播放的视频。加载视频的方法和上一篇文章中介绍的加载音频的方法一样,这里不再详述。
(3)、将视频画面输出到SurfaceView,语法格式如下:
MediaPlayer.setDisplay(SurfaceHolder sh)
参数sh用于指定SurfaceHolder对象,可以通过SurfaceView.getHolder()方法获得。
(4)、调用MediaPlayer的play()、stop()、pause()等方法控制视频播放。
下面来看一个例子:
先来看主布局文件,其内容如下:
<?xml version="1.0"encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:orientation="vertical" > <SurfaceView android:id="@+id/surfaceView1" android:keepScreenOn="true" android:layout_width="576px" android:layout_height="432px"/> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="wrap_content" android:layout_height="wrap_content" > <Button android:id="@+id/play" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="播放" /> <Button android:id="@+id/pause" android:layout_width="wrap_content" android:layout_height="wrap_content" android:enabled="false" android:text="暂停" /> <Button android:id="@+id/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止" /> </LinearLayout> </LinearLayout>
下面我们看主Activity文件,其内容如下:
package com.liuhaoyu; import java.io.IOException; import android.app.Activity; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.os.Bundle; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public classMainActivity extends Activity { private MediaPlayer mp; private SurfaceView sv; @Override publicvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mp=new MediaPlayer(); sv=(SurfaceView)findViewById(R.id.surfaceView1); Button play=(Button)findViewById(R.id.play); final Button pause=(Button)findViewById(R.id.pause); Button stop=(Button)findViewById(R.id.stop); play.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mp.reset(); try { mp.setDataSource("/sdcard/1.mp4"); mp.setDisplay(sv.getHolder()); mp.prepare(); mp.start(); pause.setText("暂停"); pause.setEnabled(true); }catch(IllegalArgumentException e) { e.printStackTrace(); }catch(SecurityException e) { e.printStackTrace(); }catch(IllegalStateException e) { e.printStackTrace(); }catch(IOException e) { e.printStackTrace(); } } }); stop.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(mp.isPlaying()){ mp.stop(); pause.setEnabled(false); } } }); pause.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(mp.isPlaying()){ mp.pause(); ((Button)v).setText("继续"); }else{ mp.start(); ((Button)v).setText("暂停"); } } }); mp.setOnCompletionListener(new OnCompletionListener(){ @Override public voidonCompletion(MediaPlayer mp) { Toast.makeText(MainActivity.this, "视频播放完毕!", Toast.LENGTH_SHORT).show(); } }); } @Override protected void onDestroy() { if(mp.isPlaying()){ mp.stop(); } mp.release(); super.onDestroy(); } }