概述
相信很多做视频的人都遇到过这样的需求,获取需要播放的视频列表进行列表展示,然后在列表中要展示一张视频的缩略图。这样的需求对于大神来说小菜一碟,所以本篇还是面向如我一般的菜鸟和小白,先上效果图。
话说贡献了我的华为5S首秀,转成GIF也破费周折,诶,小白总归会成为大神的。看效果,大概就是这样的,后台有一个异步任务AsyncTask在跑,扫描手机上的视频格式的文件,然后取到视频文件的缩略图和名称,用列表展示出来,在扫描的间隙,为了提供良好的用户体验,加一个ProgressBar来缓冲等待时间。(我这里人为使用的线程休眠2秒,为的是突出转圈的效果,实际使用的时候,可以去掉)
我认为比较有用的几个知识点:
1. 首先最重要的肯定是获取图片的缩略图了。
2. 安卓中AsyncTask异步任务的复习。
3. 适配器中ViewHolder的复用。
下面开始撸代码了,先上获取图片缩略图的方法,或者参考这里,
链接也一并奉上http://blog.csdn.net/bulreed/article/details/40404657,谢谢作者贡献。
/***
* 根据播放路径设置缩略图
* @param filePath 视频资源的路径
* @return 返回缩略图的Bitmap对象
*/
public Bitmap getVideoThumbNail(String filePath) {
Bitmap bitmap = null;
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setDataSource(filePath);
bitmap = retriever.getFrameAtTime();
}
catch(IllegalArgumentException e) {
e.printStackTrace();
}
catch (RuntimeException e) {
e.printStackTrace();
}
finally {
try {
retriever.release();
}
catch (RuntimeException e) {
e.printStackTrace();
}
}
return bitmap;
}
看一下我的ViewHolder的写法,其实也是参考网上的大神的东西,就是忘了名字和链接了,希望大神看到了不要介意
public class ViewHolder {
public static <T extends View> T get(View view, int id) {
SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
if (viewHolder == null) {
viewHolder = new SparseArray<View>();
view.setTag(viewHolder);
}
View childView = viewHolder.get(id);
if (childView == null) {
childView = view.findViewById(id);
viewHolder.put(id, childView);
}
return (T) childView;
}
}
这样写了,怎么用呢,别急,我们去到Adapter的getView方法中,如下:
忘了还有一个异步任务的使用,没用过的同学也可以顺带复习一下,其实这一段也是参考网上的写法来实现的,至于连接或者名字,请原谅我又给忘了,下次找到了,一并补上来。
public class ScannerAnsyTask extends AsyncTask<Void, Integer, List<MediaBean>> {
private List<MediaBean> mMediaInfoList = new ArrayList<MediaBean>(); // 媒体列表类
private Activity mActivity; // 依附于某个Activity,因为AsyncTask要在UI线程中执行
private ProgressBar mProgressBar;
private Handler progressHandler ;
public ScannerAnsyTask() {
super();
}
public ScannerAnsyTask(Activity activity, ProgressBar progressBar) {
super();
this.mActivity = activity;
this.mProgressBar = progressBar;
}
@Override
protected List<MediaBean> doInBackground(Void... params) {
mMediaInfoList = getVideoFile(mMediaInfoList, Environment.getExternalStorageDirectory());
//
mMediaInfoList = filterVideo(mMediaInfoList); // 这里可以选择不过滤小文件
Log.e("CJT", "最后的大小" + "ScannerAnsyTask---第一条数据--");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mMediaInfoList;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(List<MediaBean> videoInfos) {
super.onPostExecute(videoInfos);
Log.e("CJT", "最后的大小" + "ScannerAnsyTask---View.GONE--");
mProgressBar.setVisibility(View.GONE);
}
/**
* 获取视频文件
*
* @param list
* @param file
* @return
*/
private List<MediaBean> getVideoFile(final List<MediaBean> list, File file) {
file.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
String name = file.getName();
int i = name.indexOf('.');
if (i != -1) {
name = name.substring(i);
if (name.equalsIgnoreCase(".mp4") || name.equalsIgnoreCase(".3gp") || name.equalsIgnoreCase(".wmv")
|| name.equalsIgnoreCase(".ts") || name.equalsIgnoreCase(".rmvb")
|| name.equalsIgnoreCase(".mov") || name.equalsIgnoreCase(".m4v")
|| name.equalsIgnoreCase(".avi") || name.equalsIgnoreCase(".m3u8")
|| name.equalsIgnoreCase(".3gpp") || name.equalsIgnoreCase(".3gpp2")
|| name.equalsIgnoreCase(".mkv") || name.equalsIgnoreCase(".flv")
|| name.equalsIgnoreCase(".divx") || name.equalsIgnoreCase(".f4v")
|| name.equalsIgnoreCase(".rm") || name.equalsIgnoreCase(".asf")
|| name.equalsIgnoreCase(".ram") || name.equalsIgnoreCase(".mpg")
|| name.equalsIgnoreCase(".v8") || name.equalsIgnoreCase(".swf")
|| name.equalsIgnoreCase(".m2v") || name.equalsIgnoreCase(".asx")
|| name.equalsIgnoreCase(".ra") || name.equalsIgnoreCase(".ndivx")
|| name.equalsIgnoreCase(".xvid")) {
MediaBean video = new MediaBean();
file.getUsableSpace();
video.setMediaName(file.getName());
video.setPath(file.getAbsolutePath());
Log.e("CJT", "最后的大小" + "ScannerAnsyTask---视频名称--name--" + video.getPath());
list.add(video);
return true;
}
// 判断是不是目录
} else if (file.isDirectory()) {
getVideoFile(list, file);
}
return false;
}
});
return list;
}
/**
* 10M=10485760 b,小于10m的过滤掉 过滤视频文件
*
* @param videoInfos
* @return
*/
private List<MediaBean> filterVideo(List<MediaBean> videoInfos) {
List<MediaBean> newVideos = new ArrayList<MediaBean>();
for (MediaBean videoInfo : videoInfos) {
File f = new File(videoInfo.getPath());
if (f.exists() && f.isFile() && f.length() > 10485760) {
newVideos.add(videoInfo);
Log.e("CJT", "ScannerAnsyTask---视频文件大小" + f.length());
} else {
Log.e("CJT", "ScannerAnsyTask---视频文件太小或者不存在");
}
}
return newVideos;
}
}
这段代码中有两个地方要注意,在doInBackground方法里面,我标注出来如下
在MinaActivity中的使用如下:
最后源码下载。
http://download.csdn.net/download/u010898329/9769733
最后
以上就是清新小蜜蜂为你收集整理的Android遍历文件夹下的视频文件,获取视频文件的缩略图展示的全部内容,希望文章能够帮你解决Android遍历文件夹下的视频文件,获取视频文件的缩略图展示所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复