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;
003
import
java.util.ArrayList;
004
import
java.util.HashMap;
005
import
java.util.List;
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;
031
*@create 2011-6-9 下午01:17:03
036
public
class
ThumbnailActivity
extends
Activity {
037
public
static
String TAG =
"Thumbnails"
;
038
private
GridView gridView;
039
private
ArrayList<HashMap<String, String>> list;
040
private
ContentResolver cr;
043
protected
void
onCreate(Bundle savedInstanceState) {
045
super
.onCreate(savedInstanceState);
046
setContentView(R.layout.main);
050
private
void
findViews() {
051
gridView = (GridView) findViewById(R.id.gridview);
052
list =
new
ArrayList<HashMap<String, String>>();
053
cr = getContentResolver();
054
String[] projection = { Thumbnails._ID, Thumbnails.IMAGE_ID,
056
Cursor cursor = cr.query(Thumbnails.EXTERNAL_CONTENT_URI, projection,
058
getColumnData(cursor);
060
String[] from = {
"path"
};
061
int
[] to = { R.id.imageView };
062
ListAdapter adapter =
new
GridAdapter(
this
, list, R.layout.item, from,
064
gridView.setAdapter(adapter);
065
gridView.setOnItemClickListener(listener);
069
private
void
getColumnData(Cursor cur) {
070
if
(cur.moveToFirst()) {
074
int
_idColumn = cur.getColumnIndex(Thumbnails._ID);
075
int
image_idColumn = cur.getColumnIndex(Thumbnails.IMAGE_ID);
076
int
dataColumn = cur.getColumnIndex(Thumbnails.DATA);
080
_id = cur.getInt(_idColumn);
081
image_id = cur.getInt(image_idColumn);
082
image_path = cur.getString(dataColumn);
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);
092
}
while
(cur.moveToNext());
097
OnItemClickListener listener =
new
OnItemClickListener() {
100
public
void
onItemClick(AdapterView<?> parent, View view,
int
position,
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
,
114
intent.putExtra(
"path"
, path);
115
startActivity(intent);
117
Toast.makeText(ThumbnailActivity.
this
,
"Image doesn't exist!"
,
118
Toast.LENGTH_SHORT).show();
124
class
GridAdapter
extends
SimpleAdapter {
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);
134
public
void
setViewImage(ImageView v, String value) {
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));
转载于:原文链接
补充话题说明»