Thumbnail 缩略图的获取及与原始图片的映射关系
这里针对如何获取Android thumbnails的缩略图以及如何和原始图片关联。
先看一下手机内部SDcard中的Thumbnail文件,使用adb shell 下的 ls -a 命令显示隐藏文件。
提取图片和视频的缩略图可以直接访问:
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 ,分别为微型和迷你两种缩略模式,前者的分辨率更低。这样我们平时获取文件系统的某个图片预览时,可以直接调用系统缩略图,而不用自己重新计算。
在这里我们先看一下android系统是如何存放Thumbnail图片以及其原始图片的。
大家可以先检查一下/data/data/com.android.provider.media目录下面的databases:external-1014121a.db 和 internal.db,如图:
由于存储于Sdcard属于外部存储,主要信息存储于external*.db,我们查看一下此数据库的表信息。其中主要关注images 和 thumbnails 两个表。
查看两个表的数据我们可以看出Thumbnails图片和原始图片之间的映射关系。
从上面两个表中可以看出,表thumbnails和images通过thumbnails.image_id与images._id关联的,通过images的_id,就可以找出来thumbnails表中的图片和images表中图片的映射关系了。原始图片的位置就是images表中的_data字段的值。
以下为参考代码
1 package com.daisy.android.components; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 import java.util.Map; 7 8 import android.app.Activity; 9 import android.content.ContentResolver; 10 import android.content.Context; 11 import android.content.Intent; 12 import android.database.Cursor; 13 import android.graphics.Bitmap; 14 import android.graphics.BitmapFactory; 15 import android.net.Uri; 16 import android.os.Bundle; 17 import android.util.Log; 18 import android.view.View; 19 import android.widget.AdapterView; 20 import android.widget.GridView; 21 import android.widget.ImageView; 22 import android.widget.ListAdapter; 23 import android.widget.SimpleAdapter; 24 import android.widget.Toast; 25 import android.widget.AdapterView.OnItemClickListener; 26 import android.provider.MediaStore.Images.Thumbnails; 27 import android.provider.MediaStore.Images.Media; 28 29 /** 30 *@author Andrew.Lee 31 *@create 2011-6-9 下午01:17:03 32 *@version 1.0 33 *@see 34 */ 35 36 public class ThumbnailActivity extends Activity { 37 public static String TAG = "Thumbnails"; 38 private GridView gridView; 39 private ArrayList<HashMap<String, String>> list; 40 private ContentResolver cr; 41 42 @Override 43 protected void onCreate(Bundle savedInstanceState) { 44 // TODO Auto-generated method stub 45 super.onCreate(savedInstanceState); 46 setContentView(R.layout.main); 47 findViews(); 48 } 49 50 private void findViews() { 51 gridView = (GridView) findViewById(R.id.gridview); 52 list = new ArrayList<HashMap<String, String>>(); 53 cr = getContentResolver(); 54 String[] projection = { Thumbnails._ID, Thumbnails.IMAGE_ID, 55 Thumbnails.DATA }; 56 Cursor cursor = cr.query(Thumbnails.EXTERNAL_CONTENT_URI, projection, 57 null, null, null); 58 getColumnData(cursor); 59 60 String[] from = { "path" }; 61 int[] to = { R.id.imageView }; 62 ListAdapter adapter = new GridAdapter(this, list, R.layout.item, from, 63 to); 64 gridView.setAdapter(adapter); 65 gridView.setOnItemClickListener(listener); 66 67 } 68 69 private void getColumnData(Cursor cur) { 70 if (cur.moveToFirst()) { 71 int _id; 72 int image_id; 73 String image_path; 74 int _idColumn = cur.getColumnIndex(Thumbnails._ID); 75 int image_idColumn = cur.getColumnIndex(Thumbnails.IMAGE_ID); 76 int dataColumn = cur.getColumnIndex(Thumbnails.DATA); 77 78 do { 79 // Get the field values 80 _id = cur.getInt(_idColumn); 81 image_id = cur.getInt(image_idColumn); 82 image_path = cur.getString(dataColumn); 83 84 // Do something with the values. 85 Log.i(TAG, _id + " image_id:" + image_id + " path:" 86 + image_path + "---"); 87 HashMap hash = new HashMap(); 88 hash.put("image_id", image_id + ""); 89 hash.put("path", image_path); 90 list.add(hash); 91 92 } while (cur.moveToNext()); 93 94 } 95 } 96 97 OnItemClickListener listener = new OnItemClickListener() { 98 99 @Override 100 public void onItemClick(AdapterView<?> parent, View view, int position, 101 long id) { 102 // TODO Auto-generated method stub 103 String image_id = list.get(position).get("image_id"); 104 Log.i(TAG, "---(^o^)----" + image_id); 105 String[] projection = { Media._ID, Media.DATA }; 106 Cursor cursor = cr.query(Media.EXTERNAL_CONTENT_URI, projection, 107 Media._ID + "=" + image_id, null, null); 108 if (cursor != null) { 109 cursor.moveToFirst(); 110 String path = cursor.getString(cursor 111 .getColumnIndex(Media.DATA)); 112 Intent intent = new Intent(ThumbnailActivity.this, 113 ImageViewer.class); 114 intent.putExtra("path", path); 115 startActivity(intent); 116 } else { 117 Toast.makeText(ThumbnailActivity.this, "Image doesn't exist!", 118 Toast.LENGTH_SHORT).show(); 119 } 120 121 } 122 }; 123 124 class GridAdapter extends SimpleAdapter { 125 126 public GridAdapter(Context context, 127 List<? extends Map<String, ?>> data, int resource, 128 String[] from, int[] to) { 129 super(context, data, resource, from, to); 130 // TODO Auto-generated constructor stub 131 } 132 133 // set the imageView using the path of image 134 public void setViewImage(ImageView v, String value) { 135 try { 136 Bitmap bitmap = BitmapFactory.decodeFile(value); 137 Bitmap newBit = Bitmap 138 .createScaledBitmap(bitmap, 100, 80, true); 139 v.setImageBitmap(newBit); 140 } catch (NumberFormatException nfe) { 141 v.setImageURI(Uri.parse(value)); 142 } 143 } 144 } 145 146 }