转载自

http://duguyidao.iteye.com/blog/1074012


Android Thumbnail Images

在上次关于使用GridView显示Sdcard中的图片Thumbnail图片,然后点击再显示原始图片。在上次的代码中我是通过直接对原始图片进行了Scale制作为100*80的图片,然后显示出来,这样操作的话,当处理大图片的时候会浪费大量的VM内存,所以在上次提出了使用DCIM中thumbnail的缩略图文件的方法,这里图片的尺寸一般都在10-50k的大小。
接着上次关于显示Thumbnails的问题,这里针对如何获取Android thumbnails的图片以及如何和原始图片关联,说先看一下手机内部SDcard中的Thumbnail文件(参照附件1),使用Linux下的 ls -a 命令显示隐藏文件。 244668ac-3f0b-3b53-aa16-b5917e9420bc.jpg
提取图片和视频缩略图可以直接访问 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(可参看附件2)。 7d2dfea4-46fa-3589-a7f9-a291ced72787.jpg
因为存储于Sdcard属于外部存储,主要信息存储于external*.db,我们查看一下此数据库的表信息。其中主要关注p_w_picpaths 和 thumbnails 两个表。
1e0550cf-4853-3bb5-981b-49b037ee0856.jpg 查看两个表的数据我们可以看出Thumbnails图片和原始图片之间的映射关系。 96ae0d2d-3e32-3264-987b-60c37c2e2080.jpg
从上面两个表中可以看出,表thumbnails和Image 之间的关联是通过p_w_picpath_id实现的,通过会这个_id,就可以找出来thumbnails表中的图片和p_w_picpaths表中图片的映射关系了。可以就可以获取到原始图片的位置,字段为p_w_picpaths表中的_data字段的值。
参考代码可以查看过程
Java代码   收藏代码
  1. package com.daisy.android.components;  

  2. import java.util.ArrayList;  

  3. import java.util.HashMap;  

  4. import java.util.List;  

  5. import java.util.Map;  

  6. import android.app.Activity;  

  7. import android.content.ContentResolver;  

  8. import android.content.Context;  

  9. import android.content.Intent;  

  10. import android.database.Cursor;  

  11. import android.graphics.Bitmap;  

  12. import android.graphics.BitmapFactory;  

  13. import android.net.Uri;  

  14. import android.os.Bundle;  

  15. import android.util.Log;  

  16. import android.view.View;  

  17. import android.widget.AdapterView;  

  18. import android.widget.GridView;  

  19. import android.widget.ImageView;  

  20. import android.widget.ListAdapter;  

  21. import android.widget.SimpleAdapter;  

  22. import android.widget.Toast;  

  23. import android.widget.AdapterView.OnItemClickListener;  

  24. import android.provider.MediaStore.Images.Thumbnails;  

  25. import android.provider.MediaStore.Images.Media;  

  26. /**

  27. *@author Andrew.Lee

  28. *@create 2011-6-9 下午01:17:03

  29. *@version 1.0

  30. *@see

  31. */

  32. publicclass ThumbnailActivity extends Activity {  

  33. publicstatic String TAG = "Thumbnails";  

  34. private GridView gridView;  

  35. private ArrayList<HashMap<String, String>> list;  

  36. private ContentResolver cr;  

  37. @Override

  38. protectedvoid onCreate(Bundle savedInstanceState) {  

  39. // TODO Auto-generated method stub

  40. super.onCreate(savedInstanceState);  

  41.        setContentView(R.layout.main);  

  42.        findViews();  

  43.    }  

  44. privatevoid findViews() {  

  45.        gridView = (GridView) findViewById(R.id.gridview);  

  46.        list = new ArrayList<HashMap<String, String>>();  

  47.        cr = getContentResolver();  

  48.        String[] projection = { Thumbnails._ID, Thumbnails.IMAGE_ID,  

  49.                Thumbnails.DATA };  

  50.        Cursor cursor = cr.query(Thumbnails.EXTERNAL_CONTENT_URI, projection,  

  51. null, null, null);  

  52.        getColumnData(cursor);  

  53.        String[] from = { "path" };  

  54. int[] to = { R.id.p_w_picpathView };  

  55.        ListAdapter adapter = new GridAdapter(this, list, R.layout.item, from,  

  56.                to);  

  57.        gridView.setAdapter(adapter);  

  58.        gridView.setOnItemClickListener(listener);  

  59.    }  

  60. privatevoid getColumnData(Cursor cur) {  

  61. if (cur.moveToFirst()) {  

  62. int _id;  

  63. int p_w_picpath_id;  

  64.            String p_w_picpath_path;  

  65. int _idColumn = cur.getColumnIndex(Thumbnails._ID);  

  66. int p_w_picpath_idColumn = cur.getColumnIndex(Thumbnails.IMAGE_ID);  

  67. int dataColumn = cur.getColumnIndex(Thumbnails.DATA);  

  68. do {  

  69. // Get the field values

  70.                _id = cur.getInt(_idColumn);  

  71.                p_w_picpath_id = cur.getInt(p_w_picpath_idColumn);  

  72.                p_w_picpath_path = cur.getString(dataColumn);  

  73. // Do something with the values.

  74.                Log.i(TAG, _id + " p_w_picpath_id:" + p_w_picpath_id + " path:"

  75.                        + p_w_picpath_path + "---");  

  76.                HashMap hash = new HashMap();  

  77.                hash.put("p_w_picpath_id", p_w_picpath_id + "");  

  78.                hash.put("path", p_w_picpath_path);  

  79.                list.add(hash);  

  80.            } while (cur.moveToNext());  

  81.        }  

  82.    }  

  83.    OnItemClickListener listener = new OnItemClickListener() {  

  84. @Override

  85. publicvoid onItemClick(AdapterView<?> parent, View view, int position,  

  86. long id) {  

  87. // TODO Auto-generated method stub

  88.            String p_w_picpath_id = list.get(position).get("p_w_picpath_id");  

  89.            Log.i(TAG, "---(^o^)----" + p_w_picpath_id);  

  90.            String[] projection = { Media._ID, Media.DATA };  

  91.            Cursor cursor = cr.query(Media.EXTERNAL_CONTENT_URI, projection,  

  92.                    Media._ID + "=" + p_w_picpath_id, null, null);  

  93. if (cursor != null) {  

  94.                cursor.moveToFirst();  

  95.                String path = cursor.getString(cursor  

  96.                        .getColumnIndex(Media.DATA));  

  97.                Intent intent = new Intent(ThumbnailActivity.this,  

  98.                        ImageViewer.class);  

  99.                intent.putExtra("path", path);  

  100.                startActivity(intent);  

  101.            } else {  

  102.                Toast.makeText(ThumbnailActivity.this, "Image doesn't exist!",  

  103.                        Toast.LENGTH_SHORT).show();  

  104.            }  

  105.        }  

  106.    };  

  107. class GridAdapter extends SimpleAdapter {  

  108. public GridAdapter(Context context,  

  109.                List<? extends Map<String, ?>> data, int resource,  

  110.                String[] from, int[] to) {  

  111. super(context, data, resource, from, to);  

  112. // TODO Auto-generated constructor stub

  113.        }  

  114. // set the p_w_picpathView using the path of p_w_picpath

  115. publicvoid setViewImage(ImageView v, String value) {  

  116. try {  

  117.                Bitmap bitmap = BitmapFactory.decodeFile(value);  

  118.                Bitmap newBit = Bitmap  

  119.                        .createScaledBitmap(bitmap, 100, 80, true);  

  120.                v.setImageBitmap(newBit);  

  121.            } catch (NumberFormatException nfe) {  

  122.                v.setImageURI(Uri.parse(value));  

  123.            }  

  124.        }  

  125.    }  

  126. }