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

 

在上次關於使用GridView顯示Sdcard中的圖片Thumbnail圖片,然後點擊再顯示原始圖片。在上次的代碼中我是通過直接對原始圖片進行了Scale製作為100*80的圖片,然後顯示出來,這樣操作的話,當處理大圖片的時候會浪費大量的VM記憶體,所以在上次提出了使用DCIM中thumbnail的縮略圖檔的方法,這裡圖片的尺寸一般都在10-50k的大小。
接著上次關於顯示Thumbnails的問題,這裡針對如何獲取Android thumbnails的圖片以及如何和原始圖片關聯,說先看一下手機內部SDcard中的Thumbnail檔(參照附件1),使用Linux下的 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(可參看附件2)。
因為存儲于Sdcard屬於外部存儲,主要資訊存儲于external*.db,我們查看一下此資料庫的表資訊。其中主要關注images 和 thumbnails 兩個表。
查看兩個表的資料我們可以看出Thumbnails圖片和原始圖片之間的映射關係。
從上面兩個表中可以看出,表thumbnails和Image 之間的關聯是通過image_id實現的,通過會這個_id,就可以找出來thumbnails表中的圖片和images表中圖片的映射關係了。可以就可以獲取到原始圖片的位置,欄位為images表中的_data欄位的值。

package com.daisy.android.components;   
  
import java.util.ArrayList;   
import java.util.HashMap;   
import java.util.List;   
import java.util.Map;   
  
import android.app.Activity;   
import android.content.ContentResolver;   
import android.content.Context;   
import android.content.Intent;   
import android.database.Cursor;   
import android.graphics.Bitmap;   
import android.graphics.BitmapFactory;   
import android.net.Uri;   
import android.os.Bundle;   
import android.util.Log;   
import android.view.View;   
import android.widget.AdapterView;   
import android.widget.GridView;   
import android.widget.ImageView;   
import android.widget.ListAdapter;   
import android.widget.SimpleAdapter;   
import android.widget.Toast;   
import android.widget.AdapterView.OnItemClickListener;   
import android.provider.MediaStore.Images.Thumbnails;   
import android.provider.MediaStore.Images.Media;   
  
/**  
 *@author Andrew.Lee  
 *@create 2011-6-9 下午01:17:03  
 *@version 1.0  
 *@see  
 */  
  
public class ThumbnailActivity extends Activity {   
    public static String TAG = "Thumbnails";   
    private GridView gridView;   
    private ArrayList<HashMap<String, String>> list;   
    private ContentResolver cr;   
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {   
        // TODO Auto-generated method stub   
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.main);   
        findViews();   
    }   
  
    private void findViews() {   
        gridView = (GridView) findViewById(R.id.gridview);   
        list = new ArrayList<HashMap<String, String>>();   
        cr = getContentResolver();   
        String[] projection = { Thumbnails._ID, Thumbnails.IMAGE_ID,   
                Thumbnails.DATA };   
        Cursor cursor = cr.query(Thumbnails.EXTERNAL_CONTENT_URI, projection,   
                null, null, null);   
        getColumnData(cursor);   
  
        String[] from = { "path" };   
        int[] to = { R.id.imageView };   
        ListAdapter adapter = new GridAdapter(this, list, R.layout.item, from,   
                to);   
        gridView.setAdapter(adapter);   
        gridView.setOnItemClickListener(listener);   
  
    }   
  
    private void getColumnData(Cursor cur) {   
        if (cur.moveToFirst()) {   
            int _id;   
            int image_id;   
            String image_path;   
            int _idColumn = cur.getColumnIndex(Thumbnails._ID);   
            int image_idColumn = cur.getColumnIndex(Thumbnails.IMAGE_ID);   
            int dataColumn = cur.getColumnIndex(Thumbnails.DATA);   
  
            do {   
                // Get the field values   
                _id = cur.getInt(_idColumn);   
                image_id = cur.getInt(image_idColumn);   
                image_path = cur.getString(dataColumn);   
  
                // Do something with the values.   
                Log.i(TAG, _id + " image_id:" + image_id + " path:"  
                        + image_path + "---");   
                HashMap hash = new HashMap();   
                hash.put("image_id", image_id + "");   
                hash.put("path", image_path);   
                list.add(hash);   
  
            } while (cur.moveToNext());   
  
        }   
    }   
  
    OnItemClickListener listener = new OnItemClickListener() {   
  
        @Override  
        public void onItemClick(AdapterView<?> parent, View view, int position,   
                long id) {   
            // TODO Auto-generated method stub   
            String image_id = list.get(position).get("image_id");   
            Log.i(TAG, "---(^o^)----" + image_id);   
            String[] projection = { Media._ID, Media.DATA };   
            Cursor cursor = cr.query(Media.EXTERNAL_CONTENT_URI, projection,   
                    Media._ID + "=" + image_id, null, null);   
            if (cursor != null) {   
                cursor.moveToFirst();   
                String path = cursor.getString(cursor   
                        .getColumnIndex(Media.DATA));   
                Intent intent = new Intent(ThumbnailActivity.this,   
                        ImageViewer.class);   
                intent.putExtra("path", path);   
                startActivity(intent);   
            } else {   
                Toast.makeText(ThumbnailActivity.this, "Image doesn't exist!",   
                        Toast.LENGTH_SHORT).show();   
            }   
  
        }   
    };   
  
    class GridAdapter extends SimpleAdapter {   
  
        public GridAdapter(Context context,   
                List<? extends Map<String, ?>> data, int resource,   
                String[] from, int[] to) {   
            super(context, data, resource, from, to);   
            // TODO Auto-generated constructor stub   
        }   
  
        // set the imageView using the path of image   
        public void setViewImage(ImageView v, String value) {   
            try {   
                Bitmap bitmap = BitmapFactory.decodeFile(value);   
                Bitmap newBit = Bitmap   
                        .createScaledBitmap(bitmap, 100, 80, true);   
                v.setImageBitmap(newBit);   
            } catch (NumberFormatException nfe) {   
                v.setImageURI(Uri.parse(value));   
            }   
        }   
    }   
  
}  

arrow
arrow
    全站熱搜

    pcwiki 發表在 痞客邦 留言(0) 人氣()