从上文中可以看出,使用VideoView播放视频简单、方便,但有些早期的开发者还是喜欢使用MediaPlayer来播放视频,但是MediaPlayer主要用于播放音频,没有提供图像输出界面,此时需要借助于SurfaceView来显示MediaPlayer播放的图像输出。下面用一个简单示例来演示:
Activity:
- package com.home.activity;
- import java.io.IOException;
- import android.app.Activity;
- import android.media.AudioManager;
- import android.media.MediaPlayer;
- import android.os.Bundle;
- import android.os.Environment;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- import android.view.View;
- import com.home.surfaceviewplayvideo.R;
- public class SurfaceViewPlayVideoActivity extends Activity {
- private SurfaceView surfaceView;
- private MediaPlayer mplayer;
- // 记录当前视频的播放位置
- private int position;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- // 创建MediaPlayer对象
- mplayer = new MediaPlayer();
- // 获取SurfaceView组件实例
- surfaceView = (SurfaceView) findViewById(R.id.main_surfaceView);
- // 设置SurfaceView自己不管理缓冲区
- surfaceView.getHolder()
- .setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- // 设置播放时打开屏幕
- surfaceView.getHolder().setKeepScreenOn(true);
- surfaceView.getHolder().addCallback(new SurfaceListener());
- }
- public void click(View v) {
- try {
- switch (v.getId()) {
- case R.id.main_btn_play:
- play();
- break;
- case R.id.main_btn_pause:
- if (mplayer.isPlaying()) {
- mplayer.pause();
- } else {
- mplayer.start();
- }
- break;
- case R.id.main_btn_stop:
- if (mplayer.isPlaying())
- mplayer.stop();
- break;
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- private void play() throws IOException {
- mplayer.reset();
- mplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
- // 设置需要播放的视频
- mplayer.setDataSource(Environment.getExternalStorageDirectory()
- + "/devil_may_cry.mp4");
- // 把视频画面输出到surfaceView
- mplayer.setDisplay(surfaceView.getHolder());
- mplayer.prepare();
- mplayer.start();
- }
- private class SurfaceListener implements SurfaceHolder.Callback {
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width,
- int height) {
- }
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- if (position > 0) {
- try {
- // 开始播放
- play();
- // 并直接从指定位置开始播放
- mplayer.seekTo(position);
- position = 0;
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- }
- }
- // 当其他Activity被打开时
- @Override
- protected void onPause() {
- super.onPause();
- if (mplayer.isPlaying()) {
- // 保存当前的播放位置
- position = mplayer.getCurrentPosition();
- mplayer.stop();
- }
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- // 停止播放
- if (mplayer.isPlaying())
- mplayer.stop();
- // 释放资源
- mplayer.release();
- }
- }
布局XML:
- <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:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal" >
- <Button
- android:id="@+id/main_btn_play"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:onClick="click"
- android:text="播放" />
- <Button
- android:id="@+id/main_btn_pause"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:onClick="click"
- android:text="暂停" />
- <Button
- android:id="@+id/main_btn_stop"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:onClick="click"
- android:text="停止" />
- </LinearLayout>
- <SurfaceView
- android:id="@+id/main_surfaceView"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
- </LinearLayout>
从上面的开发过程不难看出,使用MediaPlayer播放视频要复杂一些,而且需要自己开发控制按钮来控制视频的播放。所以一般推荐使用VideoView来播放视频。