①:首先,写好布局
相对布局 : ListView和TextView和ProgressBar
然后是video_pager.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">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<TextView
android:id="@+id/tv_nomedia"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="没有发现视频..."
android:textColor="#000000"
android:textSize="18sp"
android:visibility="gone" />
<ProgressBar
android:id="@+id/pb_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
</RelativeLayout>
②:加载本地的视频,由于加载是个耗时操作,所以在子线程中加载视频,加载的视频放入集合中;
设置适配器要在主线程;用Handler设置适配器
从本地中获取视频的方法有两个:1.遍历sdcard,后缀名。2.从内容提供者里面获取视频。
一般情况下选择后者,不过需要注意,android6.0以上需要动态获取权限,在获取地址的同时,可以获取视频的名称、时长、大小、作者等,所以先创建一个类去作为bean类,MediaItem.class:
private String name;
private long duration;
private long size;
private String data;
private String artist;
然后在类中写上get和set以及toString方法,然后添加一个申请权限:
public static boolean isGrantExternalRW(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && activity.checkSelfPermission(
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
activity.requestPermissions(new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
}, 1);
return false;
}
return true;
}
接下来就是从本地去获取视频方法getDataFromLocal():
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(mediaItems != null && mediaItems.size() >0){
//有数据,设置适配器
//把文本隐藏
tv_nomedia.setVisibility(View.GONE);
}else{
//没有数据
//文本显示
tv_nomedia.setVisibility(View.VISIBLE);
}
pb_loading.setVisibility(View.GONE); //ProgressBar隐藏
}
};
private ArrayList<MediaItem> mediaItems;
public