原理其實挺簡單的,android 中檔案 修改 增加 刪除等等 都會在資料庫裡的某個表裡記錄下來,你需要的時候 只要迅速的去查詢這個表裡的值 即可得到你想要的所有資訊。
實際上 如果真正理解這個表結構 你就可以做很多事情了,比如迅速找到手機裡的所有mp3 檔案 png 檔案,統計某個型別的 檔案大小等等等等。
先上一張table 表圖,幫助大家理解。在data data com.android.providers.media下面 找到databases資料夾進去就可以了。有興趣的同學可以找到media部分的原始碼讀一下
1 /** 2 * 實際上為了保險這個方法最好是非同步去呼叫它這裡為了演示方便就在ui執行緒呼叫了 3 * 4 * @param context 5 * @return 6 */ 7 public static String getRecentlyPhotoPath(Context context) { 8 //這個地方利用like 和萬用字元 來尋找 系統相機儲存照片的地方 9 //實際上還可以做的更誇張一點,尋找所有目錄下的照片 並且可以限定格式 只要修改這個萬用字元語句即可 10 String searchPath = MediaStore.Files.FileColumns.DATA + " LIKE '%" + "/DCIM/Camera/" + "%' "; 11 Uri uri = MediaStore.Files.getContentUri("external"); 12 //這裡做一個排序,因為我們實際上只需要最新拍得那張即可 你甚至可以取表裡的 時間那個欄位 然後判斷一下 距離現在是否超過2分鐘 超過2分鐘就可以不顯示縮圖的 微信就是2分鐘之內剛拍的圖片 13 //會顯示 超過了就不顯示,這裡主要就是看對錶結構的理解 14 Cursor cursor = context.getContentResolver().query( 15 uri, new String[]{MediaStore.Files.FileColumns.DATA, MediaStore.Files.FileColumns.SIZE}, searchPath, null, MediaStore.Files.FileColumns.DATE_ADDED + " DESC"); 16 String filePath = ""; 17 if (cursor != null && cursor.moveToFirst()) { 18 filePath = cursor.getString(cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA)); 19 } 20 if (!cursor.isClosed()) { 21 cursor.close(); 22 } 23 return filePath; 24 }
然後我們就可以這麼呼叫:
1 iv.setImageBitmap(ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(getRecentlyPhotoPath(MainActivity.this))
當然了 對media 有過了解的同學 應該知道 攝像頭在拍完照片或者視訊的時候 會把照片的縮圖和視訊第一幀的縮圖 也儲存起來。只不過是在隱藏資料夾下面 我們多數人都看不到而已。
所以這裡我們還做了一遍算縮圖的操作的話 實際上是廢操作。效率不高。下面這個方法更高效。先找到你要的那個圖片的id 然後去縮圖表裡 直接找到縮圖即可!省略了算縮圖的步驟!
1 public static String getRecentlyPhotoId(Context context) { 2 String searchPath = MediaStore.Files.FileColumns.DATA + " LIKE '%" + "/DCIM/Camera/" + "%' "; 3 Uri uri = MediaStore.Files.getContentUri("external"); 4 Cursor cursor = context.getContentResolver().query( 5 uri, new String[]{MediaStore.Files.FileColumns._ID}, searchPath, null, MediaStore.Files.FileColumns.DATE_ADDED + " DESC"); 6 String filePath = ""; 7 if (cursor != null && cursor.moveToFirst()) { 8 //看這裡我們取id了 9 filePath = cursor.getString(cursor.getColumnIndex(MediaStore.Files.FileColumns._ID)); 10 } 11 if (!cursor.isClosed()) { 12 cursor.close(); 13 } 14 return filePath; 15 }
然後呼叫:
1 //拿到id以後就可以直接找縮圖本身了 2 iv.setImageBitmap(MediaStore.Images.Thumbnails.getThumbnail(MainActivity.this.getContentResolver(), Long.parseLong(getRecentlyPhotoId(MainActivity.this)), MediaStore.Images.Thumbnails.MICRO_KIND, new BitmapFactory.Options()));
程式碼比較簡單 直觀 就不多分析了。