作者: Android開發網原創 時間: 2010-10-20
大家都知道Android從1.5開始剛插入SD卡時系統會調用MediaScanner服務進行後台掃描,索引新的歌曲、圖片和視頻等資訊,如果我們需要快速提取圖片和影片縮圖可以直接存取 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
分別為微型和迷你兩種縮減模式,前者的解析度更低。這樣我們平時擷取檔案系統的某個圖片預覽時,可以直接調用系統縮圖,而不用自己重新計算。
最後Android123提示大家,縮圖儲存在SD卡的DCIM目錄,裡面的.thumbnails是圖片的,而.video_thumbnails是視頻的,這兩個檔案夾為隱藏屬性,一般的檔案管理工具都可以看到。
轉貼:http://www.android123.com.cn/androidkaifa/665.html
============================================================================================================================
1、Video
對於視頻,取第一幀作為縮圖,也就是怎樣從filePath得到一個Bitmap對象。
private Bitmap createVideoThumbnail(String filePath) {
Bitmap bitmap = null;
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY);
retriever.setDataSource(filePath);
bitmap = retriever.captureFrame();
} catch(IllegalArgumentException ex) {
// Assume this is a corrupt video file
} catch (RuntimeException ex) {
// Assume this is a corrupt video file.
} finally {
try {
retriever.release();
} catch (RuntimeException ex) {
// Ignore failures while cleaning up.
}
}
return bitmap;
}
複製代碼
Android提供了MediaMetadataRetriever,由JNI(media_jni)實現。
看得出MediaMetadataRetriever主要有兩個功能:MODE_GET_METADATA_ONLY和MODE_CAPTURE_FRAME_ONLY
這裡設mode為MODE_CAPTURE_FRAME_ONLY,調用captureFrame取得一幀。
另外還有兩個方法可以用:
extractMetadata 提取檔案資訊,ARTIST、DATE、YEAR、DURATION、RATING、FRAME_RATE、VIDEO_FORMAT
和extractAlbumArt 提取專輯資訊,這個下面的音樂檔案可以用到。
2、Music
對於音樂,取得AlbumImage作為縮圖,還是用MediaMetadataRetriever
private Bitmap createAlbumThumbnail(String filePath) {
Bitmap bitmap = null;
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setMode(MediaMetadataRetriever.MODE_GET_METADATA_ONLY);
retriever.setDataSource(filePath);
byte[] art = retriever.extractAlbumArt();
bitmap = BitmapFactory.decodeByteArray(art, 0, art.length);
} catch(IllegalArgumentException ex) {
} catch (RuntimeException ex) {
} finally {
try {
retriever.release();
} catch (RuntimeException ex) {
// Ignore failures while cleaning up.
}
}
return bitmap;
}
複製代碼
retriever.extractAlbumArt()得到的是byte數組,還需要一步用BitmapFactory編碼得到Bitmap對象。
3、Image
圖片就很簡單了
Bitmap bm = null;
Options op = new Options();
op.inSampleSize = inSampleSize;
op.inJustDecodeBounds = false;
bm = BitmapFactory.decodeFile(mFile.getPath(), op);
複製代碼
能直接得到Bitmap對象,把圖片縮小到合適大小就OK。
同樣上面的Video和Music,retrive到Bitmap後也需要縮小處理。
轉貼:http://blog.csdn.net/lanpy88/article/details/6602714