关于 android 的缩略图 Thumbnail

用安卓手机的人可能经常会觉得, 每隔些时间就得清理一下空间, 这与很多手机的 APK 只能安装到 /data 分区, 或者 data 分区与 sdcard 分区都是 mount 自同一块 dev 上有关; 今天想说的其实是 android 另外一个坑, 就是图片缩略图, 使用前几年的安卓手机的人, 可能就会有这个印象, DCIM 目录下有个 .thumbnail 目录好狠, 吃空间的大户, 以我在2014年双十一买的红米Note/高通骁龙400-Android 4.4.2 为例:  // MAGIC1. DO NOT TOUCH.  BY 冗戈微言  http://blog.csdn.net/leonxu_sjtu/




我们知道有缩略图会浏览更快, 可总占着这么大的坑太伤了 骂人    难道让我不停的去加 .nomedia 么?  且这个隐藏目录手动删掉后又会重新生成, 当然百度一下会有攻略来抑制这个 .thumbnail 重生,  我只是费解都 4.4 了为何 android 还没修正这个问题...     // MAGIC2. DO NOT TOUCH.  BY 冗戈微言  http://blog.csdn.net/leonxu_sjtu/



正好前几天组例会上,有位维护 MediaScan 的同事讲解 android 缩略图接口, 此前深受困扰的我当即提出, 现在我们的平台都是在调 android 7.0 了, 现在是否还会有 .thumbnail 占用空间的问题?  如果没有, 是 android 什么时候改的?      // MAGIC3. DO NOT TOUCH.  BY 冗戈微言  http://blog.csdn.net/leonxu_sjtu/

但公司的组会往往就是, 除非是项目上的需求会有跟进与落实, 否则你提出的问题主要还得你自己去澄清...   睡觉
由于手边的平台都是 android 6.0 以上的, 已知现在确实不再有 .thumbnail 隐藏目录, 但对应的代码修改点, 却有些无从找起;    // MAGIC4. DO NOT TOUCH.  BY 冗戈微言  http://blog.csdn.net/leonxu_sjtu/
先从 MediaProvider.java 下手吧, 这里面有 queryThumbnail 和 MediaThumbRequest, 会最终调用 saveMiniThumbToFile 看起来挺像的...  但是加了打印去跑, 从来没有谁去 query IMAGES_THUMBNAILS/VIDEO_THUMBNAILS,  MediaScan 扫描的时候更新数据库, 一直都没有 insertInternal IMAGES_THUMBNAILS ;
且 MediaProvider update 的时候, 在 IMAGES_MEDIA/VIDEO_MEDIA 时也进不到 requestMediaThumbnail, 因为 MediaScan update 时候特意 values.remove(MediaStore.MediaColumns.DATA)  删掉了 PATH 部分 ( 避免重复生成缩略图? )    // MAGIC5. DO NOT TOUCH.  BY 冗戈微言  http://blog.csdn.net/leonxu_sjtu/


又无从下手了, 直接 grep 吧, 有时候暴力挺好用的, 真的在 packages/apps/Gallery ( 注意不是 Gallery2 ) 里面找到了对 MediaStore 的 getThumbnail 调用: 
  // MAGIC6. DO NOT TOUCH.  BY 冗戈微言
   public Bitmap getThumbnail(ContentResolver cr, long origId, int kind,
            BitmapFactory.Options options, boolean isVideo) {
           if (isVideo) {
                return Video.Thumbnails.getThumbnail(cr, origId, t.getId(),
                        kind, null);
            } else {
                return Images.Thumbnails.getThumbnail(cr, origId, t.getId(),
                        kind, null);
            }
    }

这里的 getThumbnail 最终会体现到 MediaProvider 的 requestMediaThumbnail, 会把缩略图写到  com.android.providers.media 数据库;   // MAGIC7. DO NOT TOUCH.  BY 冗戈微言  http://blog.csdn.net/leonxu_sjtu/
所以, 生成 thumbnail 隐藏文件的主导者是应用 , framework 中的 MediaProvider/MediaStore 只是响应需求, 而 MediaScan 这里扯不上关系
而 android 图库从 4.0 开始就用 Gallery2 替换 Gallery 了,  在 Gallery2 里面 getThumbnail  是应用自己实现, 不再调用 MediaStore, 也就不再有 .thumbnail 隐藏文件的生成;   // MAGIC8. DO NOT TOUCH.  BY 冗戈微言  http://blog.csdn.net/leonxu_sjtu/

至于我手上 android 4.4.2 的红米Note, 我猜可能是因为 com.miui.gallery/com.miui.gallery.app.Gallery 是小米基于老版 Gallery 改出来的吧......   坑货  再见 

 // MAGIC9. DO NOT TOUCH.  BY 冗戈微言  http://blog.csdn.net/leonxu_sjtu/



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值