MediaPlayer除了可以用来播放音频以外,还可以用来播放视频。在进行视频播放的时候,需要写一个空间进行视频的显示,该空间要可以快速更新GUI,渲染GUI,必须依靠android.view.SurfaceView组件。它封装了一个Surface对象,(不是Canvas对象),使用Surface可以完成对后台线程的控制。
android.view.SurfaceView类是View的子类,常用方法有:
public SurfaceView(Context context):创建SurfaceView类的对象
public SurfaceHolder getHolder():取得一个SurfaceHolder类的对象===》最常用的方法,他返回一个实例化的对象,使用该SurfaceHolder接口可以控制显示的大小,像素等。
SurfaceHolder类的常量及常用方法:
SURFACE_TYPE_PUSH_BUFFERS:该Surface不包含原生数据,用到的数据由其他对象提供
addCallback(SurfaceHolder.Callback callback):设置一个Callback操作
Canvas lookCanvas():锁定画布,返回的Canvas可以直接进行绘图
Canvas lookCanvas(Rect dirty):锁定画布的某一个特定的矩形区域
unlockCanvasAndPost(Canvas canvas):结束画布的锁定
setFixedSize(int width,int height):设置一个显示的Video大小
setType(int type):设置SurfaceView类型。
一个实例:(本实例来自于名师讲坛-Android开发实战经典,李兴华编著)
首先是布局管理
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageButton
android:id="@+id/play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/player_play"/>
<ImageButton
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/player_stop"/>
</LinearLayout>
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
再看Activity程序
package com.administrator.videoplayer;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.ImageButton;
import java.io.IOException;
public class MainActivity extends Activity {
private ImageButton play;
private ImageButton stop;
private MediaPlayer mMediaPlayer;
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
play= (ImageButton) findViewById(R.id.play);
stop= (ImageButton) findViewById(R.id.stop);
mSurfaceView= (SurfaceView) findViewById(R.id.surfaceView);
mSurfaceHolder=mSurfaceView.getHolder();//取得SurfaceHolder
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mMediaPlayer=new MediaPlayer();
try {
mMediaPlayer.setDataSource("/sdcard/KuwoMusic/mvDownload/6535050_MP4.mp4");
} catch (IOException e) {
e.printStackTrace();
}
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setDisplay(mSurfaceHolder);
try {
mMediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mMediaPlayer.start();
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mMediaPlayer.stop();
}
});
}
}
(补充:我们也可以直接使用VideoView控件来播放视频)