`

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

 
阅读更多

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

//import
import 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;
	}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics