獲取Android手機上的圖片和視頻縮略圖

作者: 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


發佈了40 篇原創文章 · 獲贊 3 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章