在上次關於使用GridView顯示Sdcard中的圖片Thumbnail圖片(http://www.linuxidc.com/Linux/2011-10/45973.htm),然後點擊再顯示原始圖片。在上次的代碼中我是通過直接對原始圖片進行了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字段的值。