Uri指向已删除的文件但仍显示在应用程序中,如何?

时间:2017-03-05 23:19:16

标签: android uri mediastore

从我的应用程序内部,我使用相机拍照。然后使用ImageView将此图片加载到Uri,其类似于:content://media/external/images/media/12345。我可以通过querying the MediaStore获取此Uri的路径,它看起来像这样:/storage/emulated/0/DCIM/Camera/IMG_12345.jpg

我现在手动删除上面那条路径的图像。但是当我重新打开应用程序时,图像仍然存在,并且可以在相同的Uri下访问。如果我再次查询MediaStore,它会给我一个CursorIndexOutOfBoundsException。因此MediaStore

中不存在该文件

那么这里发生了什么?如果我手动删除了该文件,则应该无法使用该应用程序。这个档案现在在哪里?是否有更好的方法来删除图像,以便从任何地方删除它们?

2 个答案:

答案 0 :(得分:1)

MediaStore是可用文件的索引。与任何索引一样,当文件系统发生更改时,需要更新它。而且,就像搜索引擎一样,有两种主要方式可以实现:

  • 有人告诉MediaStore扫描某些内容并将其添加到索引
  • MediaStore抓取文件系统

在您的情况下,使用文件管理器删除文件可能没有更新MediaStore,部分原因是没有关于删除某些内容时如何更新MediaStore的文档。这些文档专注于索引新文件,而不是删除已删除的文件。

Uri似乎继续工作的原因是因为你的图像加载库(在你的情况下是Glide)。 Glide有一个内存缓存,它会在可能的情况下使用缓存中的图像。

答案 1 :(得分:0)

您应该阅读有关缓存的信息:https://en.wikipedia.org/wiki/Web_cache

首次下载资源(例如图像)时,浏览器(或大多数使用内置http通信组件的应用程序)将该资源保存在所谓的缓存中。当下次再次读取资源时,他们发现它已在本地缓存,因此他们不需要再通过网络加载它。

您无法完全控制该行为,但您可以使用Cache-controlProxy标题通过HTTP提供资源:https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

如果要从缓存中删除该资源,那么您必须清理浏览器缓存。通常,这可以在系统设置或浏览器设置中完成。