随时随地技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

从上文中可以看出,使用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;@Overrideprotected 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");// 把视频画面输出到surfaceViewmplayer.setDisplay(surfaceView.getHolder());mplayer.prepare();mplayer.start();}private class SurfaceListener implements SurfaceHolder.Callback {@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}@Overridepublic void surfaceCreated(SurfaceHolder holder) {if (position > 0) {try {// 开始播放play();// 并直接从指定位置开始播放mplayer.seekTo(position);position = 0;} catch (IOException e) {e.printStackTrace();}}}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}}// 当其他Activity被打开时@Overrideprotected void onPause() {super.onPause();if (mplayer.isPlaying()) {// 保存当前的播放位置position = mplayer.getCurrentPosition();mplayer.stop();}}@Overrideprotected 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" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><Buttonandroid:id="@+id/main_btn_play"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="click"android:text="播放" /><Buttonandroid:id="@+id/main_btn_pause"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="click"android:text="暂停" /><Buttonandroid:id="@+id/main_btn_stop"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="click"android:text="停止" /></LinearLayout><SurfaceViewandroid:id="@+id/main_surfaceView"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>
从上面的开发过程不难看出,使用MediaPlayer播放视频要复杂一些,而且需要自己开发控制按钮来控制视频的播放。所以一般推荐使用VideoView来播放视频。