MobliePlayer本地视频之ListView编写
tags:MobliePlayer本地视频之ListView编写
文章目录
修改原VideoPager中的initView()
修改本地视频子页面VideoPager中的public View initView() 采用这行代码View view = View.inflate(context, R.layout.video_pager,null);将video_pager布局文件加载进来。形成本地视频列表。
@Override
public View initView() {
View view = View.inflate(context, R.layout.video_pager,null);
return view;
}
创建video_pager布局文件
采用相对布局创建 video_pager.xml布局文,其中包含ListView(用于显示本地视频的列表)、TextView(如果本地无视频时通过其android:text="没有找到视频"显示无视频信息)、ProgressBar(显示本地视频加载过程)
<?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">
<ListView
android:id="@+id/lv_video_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<TextView
android:layout_centerInParent="true"
android:id="@+id/tv_nomedia"
android:text="没有找到视频"
android:textColor="@android:color/black"
android:textSize="18sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ProgressBar
android:layout_centerInParent="true"
android:id="@+id/pb_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
实例化控件
将lv_video_pager、tv_nomedia、pb_loading定义成员变量并在initView()中通过view来进行实例化,不然会异常
lv_video_pager = view.findViewById(R.id.lv_video_pager);
tv_nomedia = view.findViewById(R.id.tv_nomedia);
pb_loading = view.findViewById(R.id.pb_loading);
public class VideoPager extends BasePager {
private static final String TAG = "VideoPager";
private ListView lv_video_pager;
private TextView tv_nomedia;
private ProgressBar pb_loading;
public VideoPager(Context context) {
super(context);
}
@Override
public View initView() {
View view = View.inflate(context, R.layout.video_pager,null);
lv_video_pager = view.findViewById(R.id.lv_video_pager);
tv_nomedia = view.findViewById(R.id.tv_nomedia);
pb_loading = view.findViewById(R.id.pb_loading);
return view;
}
@Override
public void initData() {
super.initData();
Log.e(TAG,"本地视频页面初始化了");
}
}
获取本地视频的信息
MediaStore获得手机本地视频数据
private void getData() {
new Thread() {
@Override
public void run() {
super.run();
mediaItems = new ArrayList<>();
ContentResolver contentResolver = context.getContentResolver();
Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
String[] objects = new String[]{
MediaStore.Video.Media.DISPLAY_NAME,//在SD卡中显示的名称
MediaStore.Video.Media.DURATION,//视频的长度
MediaStore.Video.Media.SIZE,//视频文件的大小
MediaStore.Video.Media.DATA//视频在SD卡中的绝对地址
};
String selection = null;
String[] selectionArgs = null;
String sortOrder = null;
Cursor cursor = contentResolver.query(uri, objects, selection, selectionArgs, null,null);
//Cursor thumbCursor = null;
if(cursor!=null) {
while (cursor.moveToNext()) {
MediaItem mediaItem = new MediaItem();
String name = cursor.getString(0);
mediaItem.setName(name);
long duration = cursor.getLong(1);
mediaItem.setDuration(duration);
long size = cursor.getLong(2);
mediaItem.setSize(size);
String data = cursor.getString(3);
mediaItem.setData(data);
//把视频信息添加到mediaItems列表中
mediaItems.add(mediaItem);
}
cursor.close();
}
handler.sendEmptyMessage(0);
}
}.start();
}
权限设置
打开工程清单文件AndroidManifest.xml设置如下权限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
handler将数据发回主线程
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
/**
* 由getData() 的子线程中由handler.sendEmptyMessage(0);切换到主线程中来。
* 如果在getData()中找到有数据(也就是有视频文)就显示相应的列表,如果未找到视频数据,就显示未找到视频
*/
Log.e(TAG,String.valueOf(mediaItems.size()));
if(mediaItems != null && mediaItems.size()>0){
//将"没有找到视频"的TextView和隐藏ProgressBar
tv_nomedia.setVisibility(View.GONE);
pb_loading.setVisibility(View.GONE);
//设置适配器
lv_video_pager.setAdapter(new VideoPagerAdapter());
}else{
//假如是没有视频,将"没有找到视频"的TextView显示,ProgressBar隐藏
tv_nomedia.setVisibility(View.VISIBLE);
pb_loading.setVisibility(View.GONE);
}
}
};
适配器代码
class VideoPagerAdapter extends BaseAdapter{
@Override
public int getCount() {
return mediaItems.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(convertView == null){
convertView = View.inflate(context,R.layout.item_videopager,null);
viewHolder = new ViewHolder();
viewHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
viewHolder.tv_duration = (TextView) convertView.findViewById(R.id.tv_duration);
viewHolder.tv_size = (TextView) convertView.findViewById(R.id.tv_size);
convertView.setTag(viewHolder);
}else{
viewHolder= (ViewHolder) convertView.getTag();
}
MediaItem mediaItem = mediaItems.get(position);
viewHolder.tv_name.setText(mediaItem.getName());
viewHolder.tv_size.setText(Formatter.formatFileSize(context,mediaItem.getSize()));
viewHolder.tv_duration.setText(utils.stringForTime((int) mediaItem.getDuration()));
return convertView;
}
}
static class ViewHolder
static class ViewHolder{
TextView tv_name;
TextView tv_duration;
TextView tv_size;
}
视频播放
在initView()增加了setOnItemClickListener方法用于进行视频播施。这个是调用的自定义的播放器。 Intent intent = new Intent(context, SystemVideoPlayer.class);
@Override
public View initView() {
View view = View.inflate(context, R.layout.video_pager,null);
lv_video_pager = view.findViewById(R.id.lv_video_pager);
tv_nomedia = view.findViewById(R.id.tv_nomedia);
pb_loading = view.findViewById(R.id.pb_loading);
//设置点击事件
lv_video_pager.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
MediaItem mediaItem=mediaItems.get(position);
//启动播放器
Intent intent = new Intent(context, SystemVideoPlayer.class);
intent.setDataAndType(Uri.parse(mediaItem.getData()),"video/*");
context.startActivity(intent);
}
});
return view;
}
播放器横竖屏自动转换
方法一:在AndroidManifest.xml中配置
假设不想让软件在横竖屏之间切换,最简单的办法就是在项目的AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation属性。他有下面几个參数:
“unspecified”:默认值 由系统来推断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
“landscape”:横屏显示(宽比高要长)
“portrait”:竖屏显示(高比宽要长)
“user”:用户当前首选的方向
“behind”:和该Activity以下的那个Activity的方向一致(在Activity堆栈中的)
“sensor”:有物理的感应器来决定。假设用户旋转设备这屏幕会横竖屏切换。
“nosensor”:忽略物理感应器。这样就不会随着用户旋转设备而更改了("unspecified"设置除外)。
方法二:在java代码中设置
设置横屏代码:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏
设置竖屏代码:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏
由于横屏有两个方向的横法,而这个设置横屏的语句,假设不是默认的横屏方向,会把已经横屏的屏幕旋转180°。
所以能够先推断是否已经为横屏了。假设不是再旋转,不会让用户认为转的莫名其妙啦!代码例如以下:
if(this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
本结我遇到的错误问题及解决办法
1.创建Handle时报红
无public void handleMessage(Message msg)方法。是因为包含文导包错误。是这行代码的总是,import java.util.logging.Handler;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I8qyWGH4-1581998654178)(images/1581922337.518665.png)]
解决:删除import java.util.logging.Handler,导入import android.os.Handler;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Message;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.util.logging.Handler;
import java.util.ArrayList;
import plczl.cn.mobileplayer.R;
import plczl.cn.mobileplayer.base.BasePager;
import plczl.cn.mobileplayer.domain.MediaItem;
修改后
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Message;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.os.Handler;
import java.util.ArrayList;
import plczl.cn.mobileplayer.R;
import plczl.cn.mobileplayer.base.BasePager;
import plczl.cn.mobileplayer.domain.MediaItem;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OHaW9RXD-1581998654197)(images/1581922600.749840.png)]
这个就正常了。
本结全代码如下:
package plczl.cn.mobileplayer.pager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Message;
import android.provider.MediaStore;
import android.text.format.Formatter;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.os.Handler;
import java.util.ArrayList;
import plczl.cn.mobileplayer.R;
import plczl.cn.mobileplayer.SystemVideoPlayer;
import plczl.cn.mobileplayer.base.BasePager;
import plczl.cn.mobileplayer.domain.MediaItem;
import plczl.cn.mobileplayer.utils.Utils;
public class VideoPager extends BasePager {
private static final String TAG = "VideoPager";
private ListView lv_video_pager;
private TextView tv_nomedia;
private ProgressBar pb_loading;
private ArrayList<MediaItem> mediaItems;
private Utils utils;
public VideoPager(Context context) {
super(context);
utils = new Utils();
}
@Override
public View initView() {
View view = View.inflate(context, R.layout.video_pager,null);
lv_video_pager = view.findViewById(R.id.lv_video_pager);
tv_nomedia = view.findViewById(R.id.tv_nomedia);
pb_loading = view.findViewById(R.id.pb_loading);
//设置点击事件
lv_video_pager.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
MediaItem mediaItem=mediaItems.get(position);
//启动播放器
Intent intent = new Intent(context, SystemVideoPlayer.class);
intent.setDataAndType(Uri.parse(mediaItem.getData()),"video/*");
context.startActivity(intent);
}
});
return view;
}
@Override
public void initData() {
super.initData();
Log.e(TAG,"本地视频页面初始化了");
getData();
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
/**
* 由getData() 的子线程中由handler.sendEmptyMessage(0);切换到主线程中来。
* 如果在getData()中找到有数据(也就是有视频文)就显示相应的列表,如果未找到视频数据,就显示未找到视频
*/
Log.e(TAG,String.valueOf(mediaItems.size()));
if(mediaItems != null && mediaItems.size()>0){
//将"没有找到视频"的TextView和隐藏ProgressBar
tv_nomedia.setVisibility(View.GONE);
pb_loading.setVisibility(View.GONE);
//设置适配器
lv_video_pager.setAdapter(new VideoPagerAdapter());
}else{
//假如是没有视频,将"没有找到视频"的TextView显示,ProgressBar隐藏
tv_nomedia.setVisibility(View.VISIBLE);
pb_loading.setVisibility(View.GONE);
}
}
};
class VideoPagerAdapter extends BaseAdapter{
@Override
public int getCount() {
return mediaItems.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(convertView == null){
convertView = View.inflate(context,R.layout.item_videopager,null);
viewHolder = new ViewHolder();
viewHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
viewHolder.tv_duration = (TextView) convertView.findViewById(R.id.tv_duration);
viewHolder.tv_size = (TextView) convertView.findViewById(R.id.tv_size);
convertView.setTag(viewHolder);
}else{
viewHolder= (ViewHolder) convertView.getTag();
}
MediaItem mediaItem = mediaItems.get(position);
viewHolder.tv_name.setText(mediaItem.getName());
viewHolder.tv_size.setText(Formatter.formatFileSize(context,mediaItem.getSize()));
viewHolder.tv_duration.setText(utils.stringForTime((int) mediaItem.getDuration()));
return convertView;
}
}
static class ViewHolder{
TextView tv_name;
TextView tv_duration;
TextView tv_size;
}
private void getData() {
new Thread() {
@Override
public void run() {
super.run();
mediaItems = new ArrayList<>();
ContentResolver contentResolver = context.getContentResolver();
Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
String[] objects = new String[]{
MediaStore.Video.Media.DISPLAY_NAME,//在SD卡中显示的名称
MediaStore.Video.Media.DURATION,//视频的长度
MediaStore.Video.Media.SIZE,//视频文件的大小
MediaStore.Video.Media.DATA//视频在SD卡中的绝对地址
};
String selection = null;
String[] selectionArgs = null;
String sortOrder = null;
Cursor cursor = contentResolver.query(uri, objects, selection, selectionArgs, null,null);
//Cursor thumbCursor = null;
if(cursor!=null) {
while (cursor.moveToNext()) {
MediaItem mediaItem = new MediaItem();
String name = cursor.getString(0);
mediaItem.setName(name);
long duration = cursor.getLong(1);
mediaItem.setDuration(duration);
long size = cursor.getLong(2);
mediaItem.setSize(size);
String data = cursor.getString(3);
mediaItem.setData(data);
//把视频信息添加到mediaItems列表中
mediaItems.add(mediaItem);
}
cursor.close();
}
handler.sendEmptyMessage(0);
}
}.start();
}
}