Android遍历文件夹下的视频文件,获取视频文件的缩略图展示

相信很多做视频的人都遇到过这样的需求,获取需要播放的视频列表进行列表展示,然后在列表中要展示一张视频的缩略图。这样的需求对于大神来说小菜一碟,所以本篇还是面向如我一般的菜鸟和小白,先上效果图。

《Android遍历文件夹下的视频文件,获取视频文件的缩略图展示》

话说贡献了我的华为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方法中,如下:

《Android遍历文件夹下的视频文件,获取视频文件的缩略图展示》

忘了还有一个异步任务的使用,没用过的同学也可以顺带复习一下,其实这一段也是参考网上的写法来实现的,至于连接或者名字,请原谅我又给忘了,下次找到了,一并补上来。

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方法里面,我标注出来如下

《Android遍历文件夹下的视频文件,获取视频文件的缩略图展示》

在MinaActivity中的使用如下:

《Android遍历文件夹下的视频文件,获取视频文件的缩略图展示》


最后源码下载。

http://download.csdn.net/download/u010898329/9769733

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/u010898329/article/details/56510130
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞