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

Android使用VideoView选择文件播放(竖屏)

2016-07-18 14:16 423 查看
步骤:

1)布局

将VideoView控件放在一个RelativeLayout中水平居中(防止这部分布局高度随视频大小变化而变化,不好看)

设置一个按钮选择播放的文件,并显示正在播放的文件名

2)选择文件按钮

取得媒体库的所以视频文件信息,保存到列表list,并通过ListView控件和SimperAdapter显示让用户选择

3)VideoView加载文件并播放

其中要VideoView是通过MediaController控制的,要将它们相关联。

4)记录播放进度

这里是考虑,打开其他Activity,屏幕方向改变,home键等情况后,回到播放界面,播放进度丢失,需要了解Activity生命周期,很多博文都写得很清楚。

如果要Activity完全退出(返回键)后仍保存播放进度,应使用SharedPreferences,但这里只考虑上面说到的情况。

效果:



代码:

activity_main.xml

<LinearLayout 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:orientation="vertical"
tools:context="com.example.videoview.MainActivity" >

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="250dp"
android:background="#000000">

<VideoView
android:id="@+id/video"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true" />

</RelativeLayout>

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<Button
android:id="@+id/choose"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="选择文件" />

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/choose"
android:layout_alignBottom="@+id/choose"
android:layout_alignParentLeft="true"
android:textSize="20dp"
android:text="TextView" />

</RelativeLayout>

<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</ListView>

</LinearLayout>


MainActivity.java

package com.example.videoview;

import android.support.v7.app.ActionBarActivity;
import android.util.Config;
import android.util.Log;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.PixelFormat;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.VideoView;

@SuppressLint("NewApi")
public class MainActivity extends ActionBarActivity {

//视频播放器有关控件
VideoView videoView;
android.widget.MediaController mController;
File video;
//控制播放状态的持久性数据
static int position = 0;
static boolean isPlaying = false;
static boolean changedDirection = false;
//选择文件夹有关控件
Button choose;
TextView textView;
//DisplayList displayList = new DisplayList();
List<Map<String, Object>> list;
ListView listView;
String filePath = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.v("tag", "--------------------onCreate");
//视频播放器初始化
getWindow().setFormat(PixelFormat.TRANSLUCENT);
videoView = (VideoView)findViewById(R.id.video);
mController = new android.widget.MediaController(this);
/*
* 屏幕方向改变是onCreate()会被调用
*从其他界面回到该activity界面时,onCreate()不会被调用
*所以
*在onPause()中保存持久数据
*onResume()中用持久数据控制视频播放
*/

//选择文件初始化
choose = (Button)findViewById(R.id.choose);
textView = (TextView)findViewById(R.id.textView);
listView = (ListView)findViewById(R.id.lv);
listView.setVisibility(View.GONE);
choose.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
//取得媒体库的所以视频文件信息,保存到列表list
ContentResolver cs = getContentResolver();
Cursor cursor = cs.query(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
new String[]{"_data", "_display_name"},
null, null, null);
list = new ArrayList<Map<String, Object>>();
while(cursor != null && cursor.moveToNext()){
Map<String, Object> listItem = new HashMap<String, Object>();
listItem.put("path", cursor.getString(0));
listItem.put("name", cursor.getString(1));
list.add(listItem);
}
//使用SimpleAdapter适配器使list和listView组件关联
SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, list,
R.layout.simple_item,
new String[]{"name", "path"},
new int[]{R.id.name, R.id.path});
//显示listView
listView.setVisibility(View.VISIBLE);
listView.setAdapter(simpleAdapter);
if(list.isEmpty()) textView.setText(" 视频列表为空");
else textView.setText(" 视频列表");
}
});
listView.setOnItemClickListener(new OnItemClickListener(){
//监听listView上的单击事件
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//取出相应文件名name与地址path
Map<String, Object> item = list.get(position);
textView.setText(" " + item.get("name").toString());
filePath = item.get("path").toString();
listView.setVisibility(View.GONE);
//重新加载视频
video = new File(filePath);
if(video.exists()){
videoView.setVideoPath(video.getAbsolutePath());
videoView.setMediaController(mController);//VideoView与MediaController相关联
mController.setMediaPlayer(videoView);
videoView.requestFocus();
videoView.start();
}else{
Toast.makeText(getApplicationContext(), "找不到文件", Toast.LENGTH_SHORT).show();
}
}
});
}

@Override
protected void onResume(){
Log.v("tag", "--------------------onResume" + position);
video = new File(filePath);
if(video.exists()){
videoView.setVideoPath(video.getAbsolutePath());
//videoView与mController互相关联
videoView.setMediaController(mController);
mController.setMediaPlayer(videoView);
videoView.requestFocus();
videoView.seekTo(position);//播放进度调整到相应位置
if(changedDirection && isPlaying) videoView.start();
}else{
Toast.makeText(getApplicationContext(), "找不到文件", Toast.LENGTH_SHORT).show();
}
changedDirection = false;
super.onResume();
}

@Override
public void onConfigurationChanged(Configuration newConfig){
//Log.v("tag", "--------------------onChange" + videoView.getCurrentPosition());
//监听屏幕方向改变
changedDirection = true;
super.onConfigurationChanged(newConfig);
}

@Override
protected void onPause(){
Log.v("tag", "--------------------onPause" + position);
if(position < videoView.getCurrentPosition())//防止锁屏再解锁时position清0
position = videoView.getCurrentPosition();//保存播放进度position
isPlaying = videoView.isPlaying();
videoView.pause();
Log.v("tag", "--------------------onPause" + position);
super.onPause();
}
}


simple_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:orientation="vertical" >

<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:text="fdsa"
android:textSize="16dp" />

<TextView
android:id="@+id/path"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="middle"
android:singleLine="true"
android:text="fdsa"
android:textSize="10dp" />
</LinearLayout>

</RelativeLayout>

在AndroidMainfest.xml添加权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: