从我的应用程序内部,我使用相机拍照。然后使用ImageView
将此图片加载到Uri
,其类似于:content://media/external/images/media/12345
。我可以通过querying the MediaStore
获取此Uri
的路径,它看起来像这样:/storage/emulated/0/DCIM/Camera/IMG_12345.jpg
。
我现在手动删除上面那条路径的图像。但是当我重新打开应用程序时,图像仍然存在,并且可以在相同的Uri
下访问。如果我再次查询MediaStore
,它会给我一个CursorIndexOutOfBoundsException
。因此MediaStore
那么这里发生了什么?如果我手动删除了该文件,则应该无法使用该应用程序。这个档案现在在哪里?是否有更好的方法来删除图像,以便从任何地方删除它们?
答案 0 :(得分:1)
MediaStore
是可用文件的索引。与任何索引一样,当文件系统发生更改时,需要更新它。而且,就像搜索引擎一样,有两种主要方式可以实现:
MediaStore
扫描某些内容并将其添加到索引MediaStore
抓取文件系统在您的情况下,使用文件管理器删除文件可能没有更新MediaStore
,部分原因是没有关于删除某些内容时如何更新MediaStore
的文档。这些文档专注于索引新文件,而不是删除已删除的文件。
Uri
似乎继续工作的原因是因为你的图像加载库(在你的情况下是Glide)。 Glide有一个内存缓存,它会在可能的情况下使用缓存中的图像。
答案 1 :(得分:0)
您应该阅读有关缓存的信息:https://en.wikipedia.org/wiki/Web_cache
首次下载资源(例如图像)时,浏览器(或大多数使用内置http通信组件的应用程序)将该资源保存在所谓的缓存中。当下次再次读取资源时,他们发现它已在本地缓存,因此他们不需要再通过网络加载它。
您无法完全控制该行为,但您可以使用Cache-control
和Proxy
标题通过HTTP提供资源:https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
如果要从缓存中删除该资源,那么您必须清理浏览器缓存。通常,这可以在系统设置或浏览器设置中完成。