安卓获取视频缩略图,展示于ListView中,完美实现
应用场景:
获取安卓手机外部存储视频列表,适配器继承至CursorAdapter,利用ViewHolder进行优化;并利用异步加载和缓存机制,在加上一个绑定TAG机制。在ListView中展示视频某一帧的图片,视频名称,视频大小以及视频时长。
分析说明:
在ListView中展示视频某一帧的画面,有以下几种方式。
1.从媒体库中查询
2. android 2.2以后使用ThumbnailUtils类获取
3.调用jni文件,实现MediaMetadataRetriever类
三种方法各有利弊:
第一种方法,新视频增加后需要SDCard重新扫描才能给新增加的文件添加缩略图,灵活性差,而且不是很稳定,适合简单应用
第二种方法,实现简单,但2.2以前的版本不支持
第三种方法,实现复杂,但比较灵活
为了在UI界面中展示视频缩略图不卡顿,不乱跳,不重复加载,简单方便的前提下,我选择第二种方式实现。
先定义一个MyVideoCursorAdapter类继承至CursorAdapter
package cn.lsj.mypalyer.adapter;
import android.content.Context;
import android.database.Cursor;
import android.support.v4.widget.CursorAdapter;
import android.text.format.Formatter;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import cn.lsj.mypalyer.R;
import cn.lsj.mypalyer.bean.VideoBean;
import cn.lsj.mypalyer.utils.MyUtils;
import cn.lsj.mypalyer.utils.MyVideoThumbLoader;
import cn.lsj.mypalyer.view.MyImageView;
public class MyVideoCursorAdapter extends CursorAdapter {
private MyVideoThumbLoader mVideoThumbLoader;
public MyVideoCursorAdapter(Context context, Cursor c) {
super(context, c);
mVideoThumbLoader = new MyVideoThumbLoader();// 初始化缩略图载入方法
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
final VideoBean vb = VideoBean.getInstance(cursor);
View view = View.inflate(mContext, R.layout.video_list_item, null);
ViewHolder vh = new ViewHolder();
vh.title = (TextView) view.findViewById(R.id.video_list_item_tv_title);
vh.duration = (TextView) view
.findViewById(R.id.video_list_item_tv_duration);
vh.size = (TextView) view.findViewById(R.id.video_list_item_tv_size);
vh.iv = (MyImageView) view.findViewById(R.id.iv);
view.setTag(vh);
vh.iv.setTag(vb.path);
return view;
}
@Override
public void bindView(View view, final Context context, Cursor cursor) {
final ViewHolder vh = (ViewHolder) view.getTag();
final VideoBean vb = VideoBean.getInstance(cursor);
vh.title.setText(vb.title);
vh.duration.setText(MyUtils.DurationByMs(vb.duration));
vh.si