http://www.oschina.net/question/157182_54038

这里针对如何获取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字段的值。

以下为参考代码

001 package com.daisy.android.components;
002  
003 import java.util.ArrayList;
004 import java.util.HashMap;
005 import java.util.List;
006 import java.util.Map;
007  
008 import android.app.Activity;
009 import android.content.ContentResolver;
010 import android.content.Context;
011 import android.content.Intent;
012 import android.database.Cursor;
013 import android.graphics.Bitmap;
014 import android.graphics.BitmapFactory;
015 import android.net.Uri;
016 import android.os.Bundle;
017 import android.util.Log;
018 import android.view.View;
019 import android.widget.AdapterView;
020 import android.widget.GridView;
021 import android.widget.ImageView;
022 import android.widget.ListAdapter;
023 import android.widget.SimpleAdapter;
024 import android.widget.Toast;
025 import android.widget.AdapterView.OnItemClickListener;
026 import android.provider.MediaStore.Images.Thumbnails;
027 import android.provider.MediaStore.Images.Media;
028  
029 /**
030  *@author  Andrew.Lee
031  *@create  2011-6-9 下午01:17:03
032  *@version 1.0
033  *@see
034  */
035  
036 public class ThumbnailActivity extends Activity {
037     public static String TAG = "Thumbnails";
038     private GridView gridView;
039     private ArrayList> list;
040     private ContentResolver cr;
041  
042     @Override
043     protected void onCreate(Bundle savedInstanceState) {
044         // TODO Auto-generated method stub
045         super.onCreate(savedInstanceState);
046         setContentView(R.layout.main);
047         findViews();
048     }
049  
050     private void findViews() {
051         gridView = (GridView) findViewById(R.id.gridview);
052         list = new ArrayList>();
053         cr = getContentResolver();
054         String[] projection = { Thumbnails._ID, Thumbnails.IMAGE_ID,
055                 Thumbnails.DATA };
056         Cursor cursor = cr.query(Thumbnails.EXTERNAL_CONTENT_URI, projection,
057                 null, null, null);
058         getColumnData(cursor);
059  
060         String[] from = { "path" };
061         int[] to = { R.id.imageView };
062         ListAdapter adapter = new GridAdapter(this, list, R.layout.item, from,
063                 to);
064         gridView.setAdapter(adapter);
065         gridView.setOnItemClickListener(listener);
066  
067     }
068  
069     private void getColumnData(Cursor cur) {
070         if (cur.moveToFirst()) {
071             int _id;
072             int image_id;
073             String image_path;
074             int _idColumn = cur.getColumnIndex(Thumbnails._ID);
075             int image_idColumn = cur.getColumnIndex(Thumbnails.IMAGE_ID);
076             int dataColumn = cur.getColumnIndex(Thumbnails.DATA);
077  
078             do {
079                 // Get the field values
080                 _id = cur.getInt(_idColumn);
081                 image_id = cur.getInt(image_idColumn);
082                 image_path = cur.getString(dataColumn);
083  
084                 // Do something with the values.
085                 Log.i(TAG, _id + " image_id:" + image_id + " path:"
086                         + image_path + "---");
087                 HashMap hash = new HashMap();
088                 hash.put("image_id", image_id + "");
089                 hash.put("path", image_path);
090                 list.add(hash);
091  
092             } while (cur.moveToNext());
093  
094         }
095     }
096  
097     OnItemClickListener listener = new OnItemClickListener() {
098  
099         @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> 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 }

转载于:原文链接

标签: Android 补充话题说明»


更多相关文章

  1. Android开发本地及网络Mp3音乐播放器(五)实现专辑封面图片
  2. Android沉浸式状态栏/状态栏设置背景图片/自定义渐变式状态栏
  3. Android(安卓)ImageView ScaleType
  4. Android圆形图片控件RoundedImageView
  5. 图片阴影
  6. Xutils3.0使用详解
  7. Android图片格式NV12(YUV420SP)转YUV420P
  8. Android注解编程的第一步---模仿ButterKnife的ViewBinder机制
  9. 实现Android多张图片选择

随机推荐

  1. Jenkins-2.283 破解密码
  2. Safari 浏览器中自动填充用户名和密码功
  3. 基于web的机票管理系统设计与实现(二)
  4. RabbitMQ:address (cannot connect to hos
  5. 解读:什么是Java的递归算法?
  6. 双Hadoop集群&双Kerberos kdc认证跨域互
  7. 数据项目生命周期的7个步骤——在业务中
  8. Linux学习--第14周
  9. 圣怀布局,网格(容器,项目,单元,轨道,间距
  10. DSaaS,一个创新的云密码服务