android获取缩略图有2种方法,第一种是通过android提供的方法来获取缩略图,这种方式获取缩略图的比较慢,第二种是通过图库来获取图片和视频的缩略图,这种方法比较快。
## 方法一 ##
直接通过ThumbnailUtils来获取图片和视频的缩略图:
/**
* 获取视频的缩略图
* 先通过ThumbnailUtils来创建一个视频的缩略图,然后再利用ThumbnailUtils来生成指定大小的缩略图。
* 如果想要的缩略图的宽和高都小于MICRO_KIND,则类型要使用MICRO_KIND作为kind的值,这样会节省内存。
* @param videoPath 视频的路径
* @param width 指定输出视频缩略图的宽度
* @param height 指定输出视频缩略图的高度度
* @param kind 参照MediaStore.Images.Thumbnails类中的常量MINI_KIND和MICRO_KIND。
* 其中,MINI_KIND: 512 x 384,MICRO_KIND: 96 x 96
* @return 指定大小的视频缩略图
*/
private Bitmap getVideoThumbnail(String videoPath, int width, int height,
int kind) {
Bitmap bitmap = null;
// 获取视频的缩略图
bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, kind);
System.out.println("w"+bitmap.getWidth());
System.out.println("h"+bitmap.getHeight());
bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
return bitmap;
}
## 方法二 ##
通过MediaStore来获取视频的缩略图,通过这种方式来获取缩略图的速度明显比第一种方法要快,第二种方式获取来的缩略图是在手机中开机就已经拿到手机中的缩略图了,直接通过数据库的方法来查询,明显比第一种要快:
/**
* 通过文件名 获取视频的缩略图
*
* @param context
* @param cr cr = getContentResolver();
* @param testVideopath 全路径 "/mnt/sdcard/sidamingbu.mp4";
* @return
*/
public static Bitmap getVideoThumbnail(Context context, ContentResolver cr, String testVideopath) {
// final String testVideopath = "/mnt/sdcard/sidamingbu.mp4";
ContentResolver testcr = context.getContentResolver();
String[] projection = { MediaStore.Video.Media.DATA, MediaStore.Video.Media._ID, };
String whereClause = MediaStore.Video.Media.DATA + " = '" + testVideopath + "'";
Cursor cursor = testcr.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, projection, whereClause,
null, null);
int _id = 0;
String videoPath = "";
if (cursor == null || cursor.getCount() == 0) {
return null;
}
if (cursor.moveToFirst()) {
int _idColumn = cursor.getColumnIndex(MediaStore.Video.Media._ID);
int _dataColumn = cursor.getColumnIndex(MediaStore.Video.Media.DATA);
do {
_id = cursor.getInt(_idColumn);
videoPath = cursor.getString(_dataColumn);
System.out.println(_id + " " + videoPath);
} while (cursor.moveToNext());
}
BitmapFactory.Options options = new BitmapFactory.Options();
options.inDither = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = MediaStore.Video.Thumbnails.getThumbnail(cr, _id, Images.Thumbnails.MICRO_KIND,
options);
return bitmap;
}
图片和视频的索引及其与对应缩略图的对应关系在 /sdcard/data/data/com.android.providers.media/databases中的db文件中,
图片对应表images和thumbnails
images
_id 图片id
_data 图片路径
thumbnails
_id 缩略图id
_data 缩略图存储位置
image_id 对应原图id
视频对应表images和thumbnails
video
_id 视频id
_data 视频路径
videothumbnails
_id 视频缩略图id
_data 视频缩略图存储位置
image_id 对应视频id (这个应该是VIDEO_ID)
下面再来总结一下获取视频缩略图的方法:
1. 获取视频的uri
2. 转换为String,得到视频id
3. 去videothumbnails表中找到视频缩略图路径
4. 根据路径得到图片