android 播放视频

播放视频的两种方式:

使用VideoView播放视频(方便,推荐)

使用MediaPlayer和SurfaceView播放视频(早期的方式)


第一种方式:

使用VideoView播放视频的步骤如下:

在界面布局文件中定义VideoView组件,或在程序中创建VideoView组建

调用VideoView的如下两个方法加载指定视频

setVideoPath(String paht):加载path文件所代表的视频

setVideoURI(URI uri):加载uri所对应的视频

调用VideoVIew的start(),stop(),pause()方法来控制视频播放


MediaContraller类

与VideoView一起结合使用的还有一个MediaContraller类,它的作用时提供一个友好的图形控制界面,通过该控制界面来控制视频的播放,快进键,暂停键,后退键以及播放进度

条都是该类提供


例子代码:

xml布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical"
	android:layout_width="match_parent"
	android:layout_height="match_parent">
<!-- 定义VideoView播放视频 -->
<VideoView
	android:id="@+id/video"
	android:layout_width="match_parent"
	android:layout_height="match_parent" />
</LinearLayout>
Activity:

import java.io.File;

import android.app.Activity;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.VideoView;

public class VedioViewTest extends Activity {
    VideoView       videoView;

    MediaController mController;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFormat(PixelFormat.TRANSLUCENT);
        setContentView(R.layout.main);
        // 获取界面上VideoView组件
        videoView = (VideoView) findViewById(R.id.video);
        // 创建MediaController对象
        mController = new MediaController(this);
        File video = new File("/mnt/sdcard/movie.mp4");
        if (video.exists()) {
            videoView.setVideoPath(video.getAbsolutePath()); //①
            // 设置videoView与mController建立关联
            videoView.setMediaController(mController); //②
            // 设置mController与videoView建立关联
            mController.setMediaPlayer(videoView); //③
            // 让VideoView获取焦点
            videoView.requestFocus();
        }
    }
}

第二种方式:

使用MediaPlayer播放视频的步骤如下:

创建MediaPlayer对象,并让它加载指定的视频文件

在界面布局文件中定义SurfaceView组件,或在程序中创建SurfaceView组件,并为SurfaceView的SurfaceView的SurfaceHolder增加Callback监听器 

调用 MediaPlayer对象的setPisplay(SurfaceHolder sh):将所播放的视频图像输出到指定的SurfaceView组件

调用MediaPlayer对象的start(),stop(),和pause()方法来控制视频的播放


例子代码:

xml布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
	xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
<SurfaceView
	android:id="@+id/surfaceView"
	android:layout_width="match_parent" 
	android:layout_height="360dp"
	/>
<LinearLayout
	android:orientation="horizontal"
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:layout_alignParentBottom="true"
	android:gravity="center_horizontal">
<ImageButton
	android:id="@+id/play"
	android:layout_width="wrap_content" 
	android:layout_height="wrap_content" 
	android:src="@drawable/play"
    />
<ImageButton
    android:id="@+id/pause"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/pause"
    />
<ImageButton
	android:id="@+id/stop"
	android:layout_width="wrap_content" 
	android:layout_height="wrap_content" 
	android:src="@drawable/stop"
	/>
</LinearLayout>	
</RelativeLayout>

Activity:

import java.io.IOException;

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.ImageButton;

public class SurfaceViewPlayVideo extends Activity
	implements OnClickListener
{
	SurfaceView surfaceView;
	ImageButton play, pause, stop;
	MediaPlayer mPlayer;
	// 记录当前视频的播放位置
	int position;

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// 获取界面中的3个按钮
		play = (ImageButton) findViewById(R.id.play);
		pause = (ImageButton) findViewById(R.id.pause);
		stop = (ImageButton) findViewById(R.id.stop);
		// 为3个按钮的单击事件绑定事件监听器
		play.setOnClickListener(this);
		pause.setOnClickListener(this);
		stop.setOnClickListener(this);
		// 创建MediaPlayer
		mPlayer = new MediaPlayer();
		surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
		// 设置播放时打开屏幕
		surfaceView.getHolder().setKeepScreenOn(true);
		surfaceView.getHolder().addCallback(new SurfaceListener());
	}

	@Override
	public void onClick(View source)
	{
		try
		{
			switch (source.getId())
			{
				// 播放按钮被单击
				case R.id.play:
					play();
					break;
				// 暂停按钮被单击
				case R.id.pause:
					if (mPlayer.isPlaying())
					{
						mPlayer.pause();
					}
					else
					{
						mPlayer.start();
					}
					break;
				// 停止按钮被单击
				case R.id.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("/mnt/sdcard/movie.3gp");
		// 把视频画面输出到SurfaceView
		mPlayer.setDisplay(surfaceView.getHolder());  //①
		mPlayer.prepare();
		// 获取窗口管理器
		WindowManager wManager = getWindowManager();
		DisplayMetrics metrics = new DisplayMetrics();
		// 获取屏幕大小
		wManager.getDefaultDisplay().getMetrics(metrics);
		// 设置视频保持纵横比缩放到占满整个屏幕
		surfaceView.setLayoutParams(new LayoutParams(metrics.widthPixels
			, mPlayer.getVideoHeight() * metrics.widthPixels
			/ mPlayer.getVideoWidth()));
		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 (Exception e)
				{
					e.printStackTrace();
				}
			}
		}

		@Override
		public void surfaceDestroyed(SurfaceHolder holder)
		{
		}
	}

	// 当其他Activity被打开,暂停播放
	@Override
	protected void onPause()
	{
		if (mPlayer.isPlaying())
		{
			// 保存当前的播放位置
			position = mPlayer.getCurrentPosition();
			mPlayer.stop();
		}
		super.onPause();
	}

	@Override
	protected void onDestroy()
	{
		// 停止播放
		if (mPlayer.isPlaying()) mPlayer.stop();
		// 释放资源
		mPlayer.release();
		super.onDestroy();
	}
}


android 播放视频,布布扣,bubuko.com

android 播放视频

上一篇:Spark Job的提交与task本地化分析(源码阅读八)


下一篇:android控件篇:ViewPager+Fragment+GridView的使用(与AndroidQuery框架结合)