Android 高仿微信 获取最近刚刚拍照的缩略图 功能实现
原理其实挺简单的,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()));
代码比较简单 直观 就不多分析了。