原理其實挺簡單的,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()));
代碼比較簡單 直觀 就不多分析了。