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
MainActivity.java
simple_item.xml
在AndroidMainfest.xml添加权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
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"/>
相关文章推荐
- android adb push 命令
- Android-jar包的重新打包
- Android漂亮的对话框项目sweet-alert-dialog
- cannot resolve corresponding JNI function
- 可拖动GridView的实现,类似支付宝界面
- Android系统启动逻辑02
- Android 跨进程通信学习标签
- android wear下载
- android学笔记 AsynTask异步向服务器Post图片
- android自定义圆角的布局
- 浅谈Android自定义锁屏页的发车姿势
- Android调用系统剪裁参数
- 安卓注解框架 annotation
- android 通讯录侧边快速索引
- Android Studio 翻译插件
- Android Studio工程导入另一个工程作为lib
- Android ListView/GridView 中Adapter的用法(1)
- Android调用系统软件打开文件(包括apk文件)
- Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab
- Android6.0 属性系统