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

Android Uri指向已删除的文件,但仍显示在应用程序中,如何?,android,uri,mediastore,Android,Uri,Mediastore,在我的应用程序中,我用相机拍照。然后使用其Uri将该图片加载到ImageView中,该Uri类似于:content://media/external/images/media/12345。我可以通过以下方式获得此Uri的路径:/storage/emulated/0/DCIM/Camera/IMG_12345.jpg 我现在从上面的路径手动删除图像。但当我重新打开应用程序时,图像仍然存在,并且可以在相同的Uri下访问。如果我再次查询MediaStore,它会给我一个CursorIndexOutOf

在我的应用程序中,我用相机拍照。然后使用其
Uri
将该图片加载到
ImageView
中,该Uri类似于:
content://media/external/images/media/12345
。我可以通过以下方式获得此
Uri的路径:
/storage/emulated/0/DCIM/Camera/IMG_12345.jpg

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


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

您应该阅读有关缓存的内容:

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

您不能完全控制行为,但可以使用
缓存控制
代理
头通过HTTP为您的资源提供服务:


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

MediaStore
是可用文件的索引。与任何索引一样,它需要在文件系统发生更改时进行更新。与搜索引擎一样,这主要有两种方式:

  • 有人告诉
    MediaStore
    扫描某些内容并将其添加到索引中
  • MediaStore
    对文件系统进行爬网
在您的情况下,使用文件管理器删除文件可能不会更新
MediaStore
,部分原因是没有文档说明在删除某些内容时如何更新
MediaStore
。这些文档的重点是为新文件编制索引,而不是删除已删除的文件


Uri
之所以能够继续工作,是因为您的图像加载库(在您的例子中是Glide)。Glide有一个内存缓存,如果可能,它将使用缓存中的图像。

您如何删除应用程序?您使用的是文件管理器还是更新MediaStore的应用程序?此外,存储图像的目录是否与某种云存储(如google pictures)同步?请尝试使用Gallery应用程序(该应用程序也会更新MediaStore)删除图像,看看您的问题是否消失。另外,您没有说,但是否有可能该文件正在从云存储中刷新?文件管理器无法告诉
MediaStore
该文件正在被删除。在添加文件时,我们可以使用
MediaScannerConnection
进行此操作。
MediaStore
最终将更新其索引,但这可能需要几个小时。“是否保证MediaStore会自己处理它?”——它应该这样做。“或者可以通过某种方式恢复图像?”——这应该是不可能的。在这种情况下,文件系统就是“记录系统”
MediaStore
只是一个索引。打个比方:如果你删除一个网页,像谷歌这样的搜索引擎仍然会说它存在一段时间,直到它再次抓取该网站。虽然谷歌(或许还有其他搜索引擎)可能会缓存选定的网页,
MediaStore
不会,因为这些是手机,而不是服务器场,而且它没有空间。嗯。。。您确定要重新加载图像吗?“重新打开应用程序”在Android中的含义与在Windows中的含义不同。除非您终止进程,否则内存中的任何缓存(例如,来自像毕加索这样的图像加载库)都将保持完整。这对于应用程序而不是浏览器,是否仍然适用?正如我所说,如果应用程序使用内置组件通过http下载资源,通常使用本地浏览器缓存。有时他们会实现自己的浏览器缓存,所以请查看他们的选项,也许有办法清除缓存。删除已删除文件的最佳解决方案是什么。@纳伦德拉索拉齐亚:老实说,我不确定存在哪些解决方案。我没有研究过这一点。我使用DownloadManager下载了文件,然后我卸载了应用程序,文件也按照DownloadManager的新行为删除了,但使用mediaStore,我仍然在列表中显示该文件。