为什么 vivo 手机会检测到了图片被删除?
还记得拼多多保存图片的地址吗?DCIM/Pindd/image/16是在 DCIM 下,DCIM 相当于系统公共的相册目录,在这个目录下做任何图片的保存,删除操作,系统都会得到相册被改动的通知,所以当拼多多删除那张临时文件时,vivo 出现了图片被删除的通知。
真正有问题的地方是,拼多多不应该在 DCIM 保存临时的图片文件,我相信这个问题不止拼多多一个 App 有,很多 App 都可能存在这个问题,归根结底,是对 Android 文件目录使用不规范的问题,应用内的临时文件,应该保存在 App 的私有缓存目录下,Android 的开发文档有明确说明。
根据拼多多官方微博最新的声明,也验证了我的猜想是正确的。
正确的做法其实也很简单,这种临时文件放在内部存储 getCacheDir() 或外部存储 getExternalCacheDir() 这两个缓存文件目录里面就可以了,当真正完成所有的逻辑之后,再将图片同步到公共的相册文件夹中。
相比拼多多,微信的聊天页面也有拍照编辑发送这一场景,反观微信,只有在最后一步发送点击之后,该图片才会被保存到手机里用户可见的图片文件夹中,至于中间的临时文件,用户是无法感知的。
当我写这篇文章的时候,发现拼多多的 App 里在编辑图片之后,已经不会删掉原图了,大概是通过热修复的方法,把这里的逻辑做了暂时性的处理。
看似解决了问题,不过根本上,还是对 Android 文件目录使用不规范的问题,热修复也是治标不治本的解决方案,希望拼多多之后可以彻底的解决这个问题吧。
况且 Android 10 Google 已经推出了新的 Scoped Storage 规范,虽然在 Android 10 上没有严格执行,但在 Android 11 上是必须适配的,所以看到这篇文章的同学,也希望大家可以检查一下这部分的代码,尽早做适配。
现在再回看这个问题,你说这个问题严重吗?
从技术的角度来说,确实是一个小问题,但从事件发酵的角度来说,它是一个大问题,任何一个小问题都有可能带来严重的后果,所以说写代码是需要时刻保持严谨的,不只是简单的完成需求,更要仔细想想,它真的没问题了吗?
再次推荐大家,无论你的技术如何,时不时的去翻阅一下 Android 的官