您的位置:首页 > 移动开发 > Android开发

Android 视频播放器VideoView

2017-04-10 21:49 141 查看

项目简介:

该项目为视频播放器,使用的是Android自己的框架VideoView完成的。

另外,使用SurfaceView+MediaPlayer实现视频播放的到这里去

使用另一个开源的框架Vitamio是实现视频播放的到这里去

详细介绍:

用户点击按钮后,将会播放一段视频。无论是用户用home键返回桌面还是用返回键返回上一个Activity,只要该应用程序所在进程没有被杀死,在此进入该视频将继续接着上次位置开始播放

该应用涉及到的知识有:

1.VideoView的使用

VideoView实质上是MediaPlayer+SurfaceView的封装

2.getApplicationContext()与this的区别

在本程序中获取MediaController的时候会发现传入this应用一切正常,但是如果传入getApplicationContext(),一旦点击屏幕程序就会出错,直接返回上一个Activity。这是因为两者获取的Context对象是有区别的。

getApplicationContext():这是取得整个应用的上下文,在整个应用中是唯一的,且生命周期与整个应用的周期相同。

this:主要有三种用法

  1).表示对当前对象的引用

  2).表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分

  3).用于在构造方法中引用满足指定参数类型的构造器(其实也就是构造方法)。但是这里必须非常注意:只能引用一个构造方法且必须位于开始

  当this用来表示context的时候,注意是当前的上下文,而不一定是整个应用的上下文

注意:

1.Activity需要在清单文件中注册

2.需要在清单文件中添加权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>


涉及到读取SD卡的视频,所有需要添加这一条

步骤:

1.首先创建一个Android项目,创建两个布局文件。

第一个布局文件是 activity_main.xml ,这个布局文件中仅有一个按钮:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="hhh.exercise.smultimedia_e.MainActivity" >

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="click"
android:text="点击看片 "
android:textSize="30sp"
android:textColor="#00ff00" />

</RelativeLayout>


第二个布局文件是activity_second.xml,这个布局文件也非常简单,只有一个VideoView控件,这是用来播放是视频时的布局文件:

<?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" >

<VideoView
android:id="@+id/vv"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</LinearLayout>


2.编写Activity的代码

首先是MainActivity的代码,这个Activity的作用就是跳转界面到视频播放上。一般情况下,都是从一个ListView的条目中跳转到视频播放上,然后通过Intent携带数据(视频的信息)给另一个Activity,这里直接简化了,直接点击按钮就开始播放,没有携带任何数据。

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void click(View view) {
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);

}
}


然后是编写SecondActivity的代码,这个Activity加载activity_second.xml布局文件,然后播放视频。

import java.io.File;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Environment;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView;

/**
* @author HHH
*
*/
public class SecondActivity extends Activity {

private VideoView vv;
private MediaController mc;
private static int secondCurrentPosition;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// 隐藏标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);

// 设置横屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

//设置全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

// 不需要设置播放时屏幕常量,因为在VideoView控件中系统设置过了。直接加载布局文件即可
setContentView(R.layout.activity_second);

vv = (VideoView) findViewById(R.id.vv);
final File file = new File(Environment.getExternalStorageDirectory().getPath(), "s3.mp4");

// 创建一个MediaController。
// 这里的Context一定要传入this,不能用getApplicationContext().否则一点击屏幕就闪退
mc = new MediaController(SecondActivity.this);

// 开创建SurfaceView的控制器
SurfaceHolder holder = vv.getHolder();
holder.addCallback(new Callback() {

@Override
public void surfaceCreated(SurfaceHolder holder) {

if (file.exists()) {
// 设置要播放的视频
vv.setVideoPath(file.getPath());

// 设置VideoView与MediaController相关联
vv.setMediaController(mc);

// 设置VideoView获取焦点
vv.requestFocus();

// 将背景图片设为透明
// vv.getBackground().setAlpha(0);

// 开始播放视频(如果上次有播放记录,接着上次播放)
vv.start();
vv.seekTo(secondCurrentPosition);

} else {
Toast.makeText(getApplicationContext(), "视频不存在", 0).show();
}

}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}

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

// 设置播放完毕后循环播放
vv.setOnCompletionListener(new OnCompletionListener() {

@Override
public void onCompletion(MediaPlayer mp) {
mp.seekTo(0);
mp.start();
}
});

// 增加监听上一个和下一个的切换事件,默认这两个按钮是不显示的
mc.setPrevNextListeners(new OnClickListener() {

@Override
public void onClick(View v) {
// 这里直接弹出吐司,开发中这里应当切换到下一首
Toast.makeText(SecondActivity.this, "下一个", 0).show();
}
}, new OnClickListener() {

@Override
public void onClick(View v) {
Toast.makeText(SecondActivity.this, "上一个", 0).show();
}
});

}

// 当Activity退出界面(无论Activity是否销毁了),记录当前视频播放进度
@Override
protected void onPause() {
if (vv.isPlaying()) {
secondCurrentPosition = vv.getCurrentPosition();
vv.pause();
vv.suspend();
}
super.onPause();
}

}


3.清单文件中注册并添加权限

注册

<activity android:name="SecondActivity"></activity>


添加权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>


4.部署后演示效果。

进入应用后,点击按钮看片



点击一下屏幕,就会出现控制栏



点击快进,后退,停止/播放键都可以

点击SeekBar(即进度条)到任意位置,都会找到那个位置进行播放

直接按手机home键或者返回键返回,下次进入界面都会继续播放。但是一定整个应用的进程没有背杀死。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息