当前位置: 代码迷 >> Android >> android 获取视频跟图片的缩略图
  详细解决方案

android 获取视频跟图片的缩略图

热度:99   发布时间:2016-05-01 19:20:38.0
android 获取视频和图片的缩略图

1 在显示视频图片列表时,发送彩信时,制作幻灯片时都需要显示视频或图片的缩略图,显示代码如下:

//importimport android.content.ContentResolver;import android.content.ContentUris;import android.graphics.Bitmap;import android.provider.MediaStore.Video;import android.widget.ImageView;//ImageView控件private ImageView mImagePreview;//.............................        //初始化ImageView        mImagePreview = (ImageView) findViewById(R.id.image_preview);                //video为视频文件对应的uri        long id = ContentUris.parseId(video);        ContentResolver mContentResolver = mContext.getContentResolver();                //缩略图类型:MINI_KIND FULL_SCREEN_KIND MICRO_KIND        Bitmap miniThumb = Video.Thumbnails.getThumbnail(mContentResolver, id,                Video.Thumbnails.MINI_KIND, null);        //填充图片        mImagePreview.setImageBitmap(miniThumb);//...............................

?

或者使用

Bitmap bitmap = VideoAttachmentView.createVideoThumbnail(mContext,video); 来获取图片

?

2 在android.provider.MediaStore中包含对图片和视频的各种处理类,其中?android.provider.MediaStore.Images.Thumbnails 和android.provider.MediaStore.Video.Thumbnails提供了图片和视频生成缩略图的方法。

3 图片和视频的索引及其与对应缩略图的对应关系在 /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 

?

4 ?以获取视频的缩略图为例,具体步骤如下:

  1 获取视频的uri

  2 转换为String,得到视频id

  3 去videothumbnails表中找到视频缩略图路径

  4 根据路径得到图片

?

?5 ? 其他可参考:获取Android手机上的图片和视频缩略图

?

?

大家都知道Android从1.5开始刚插入SD卡时系统会调用MediaScanner服务进行后台扫描,索引新的歌曲、图片和视频等信息,如果我们需要快速提取图片和视频缩略图可以直接访问 android.provider.MediaStore.Images.Thumbnails 和android.provider.MediaStore.Video.Thumbnails这两个数据库,即可查询出来缩略图
  如何判断文件呢? 可以通过Cursor遍历数据库,对比INTERNAL_CONTENT_URI字段的值,这是一个Uri我们可以转成String,这里保存着Android手机SD卡上的多媒体文件完整路径。
  有关具体的缩略图可以通过getThumbnail(ContentResolver cr, long origId, int kind, BitmapFactory.Options options) 或getThumbnail(ContentResolver cr, long origId, long groupId, int kind, BitmapFactory.Options options) 方法获取,这两种方法返回Bitmap类型,而缩略图的分辨率可以从HEIGHT和WIDTH两个字段提取,在Android上缩略图分为两种,通过读取 KIND字段来获得,分别为MICRO_KIND和MINI_KIND 分别为微型和迷你两种缩略模式,前者的分辨率更低。这样我们平时获取文件系统的某个图片预览时,可以直接调用系统缩略图,而不用自己重新计算。
  缩略图保存在SD卡的DCIM目录,里面的.thumbnails是图片的,而.video_thumbnails是视频的,这两个文件夹为隐藏属性,一般的文件管理器都可以看到。

/**	 * 获取图片、视频、音乐列表	 */	public List<FileModel> getFileList(Uri uri) {		String fileType = null;		//判断类型		if (uri==imageUri) {			fileType="0";		}else if (uri==audioUri) {			fileType="1";		}else if (uri==videoUri) {			fileType="2";		}		Uri fileUri=uri;		List<FileModel> fileList = new ArrayList<FileModel>();		Cursor cur = mContext.getContentResolver().query(fileUri, null, null, null, null);		try {			while (cur.moveToNext()) {	    		String id = cur.getString(cur.getColumnIndexOrThrow(MediaStore.Images.Media._ID));  	//音乐图片视频都是同一个"_display_name"	    		String fileName = cur.getString(cur.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME));  	//音乐图片视频都是同一个"_display_name"	    		String filePath = cur.getString(cur.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));    	    		long fileSize = cur.getLong(cur.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE)); 					    		//判断文件存在才插入。因为有些文件被删除了。数据库要重新开机才会更新	    		if (new File(filePath).exists()) {					System.out.println(id);					System.out.println(filePath);										//_id图片id等于image_id 对应原图id 					//获取缩略图路径					String fileThumbnailPath="";					Cursor cur2 = mContext.getContentResolver().query(Thumbnails.EXTERNAL_CONTENT_URI, null, Thumbnails.IMAGE_ID+"=?" ,new String[]{id}, null);					while (cur2.moveToNext()) {						fileThumbnailPath = cur2.getString(cur2.getColumnIndexOrThrow(Thumbnails.DATA));					}										FileModel model = new FileModel();					model.setFile(new File(filePath));					model.setFileName(fileName);					model.setFilePath(filePath);					model.setFileThumbnailPath(fileThumbnailPath);	//设置缩略图路径					model.setFileSiz(MyMethods.formatSize(fileSize));	//格式化大小					model.setFileType(fileType);					fileList.add(model);				}			}		} catch (IllegalArgumentException e) {			e.printStackTrace();		}finally{			if (cur != null) {				cur.close();			}		}		return fileList;	}

?

  相关解决方案