【问题标题】:Uri points to deleted file but still displays in app, how?Uri指向已删除的文件但仍显示在应用程序中,怎么办?
【发布时间】:2017-03-05 23:19:16
【问题描述】:

在我的应用程序中,我使用相机拍照。然后使用它的Uri 将这张图片加载到ImageView 中,看起来像这样:content://media/external/images/media/12345。我可以通过querying the MediaStore 得到这个Uri 的路径,它看起来像这样:/storage/emulated/0/DCIM/Camera/IMG_12345.jpg

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

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

【问题讨论】:

  • 如何删除应用程序?您使用的是文件管理器还是使用更新 MediaStore 的应用程序?此外,存储图像的目录是否与某种云存储同步,例如谷歌图片?
  • 尝试使用 Gallery 应用程序(也更新 MediaStore)删除图片,看看您的问题是否消失。另外,您没有说,但是文件是否有可能从云存储中刷新?
  • 文件管理器无法告诉MediaStore文件正在被删除。添加文件时,我们可以使用MediaScannerConnectionMediaStore 最终会更新其索引,但这可能需要几个小时。
  • “是否保证 MediaStore 会自行处理?” - 它应该。 “或者可以通过某种方式恢复图像?” ——这应该是不可能的。在这种情况下,文件系统是“记录系统”。 MediaStore 只是一个索引。打个比方:如果你删除了一个网页,像谷歌这样的搜索引擎仍然会说它存在一段时间,直到它再次爬取那个网站。虽然 Google(可能还有其他搜索引擎)可能会缓存选定的网页,但 MediaStore 不会,因为这些是电话,而不是服务器群,而且它没有空间。
  • 嗯...您确定要重新加载图像吗? “重新打开应用程序”在 Android 中的含义与在 Windows 中的含义不同。除非您终止进程,否则任何内存中的缓存(例如,来自 Picasso 之类的图像加载库)仍然完好无损。

标签: android uri mediastore


【解决方案1】:

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

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

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

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

【讨论】:

  • 删除已删除文件的最佳解决方案是什么。
  • @NarendraSorathiya:老实说,我不确定存在哪些解决方案。这一点我没有研究过。
  • 我已经使用 DownloadManager 下载了文件,然后我卸载了应用程序,文件也根据 DownloadManager 的新行为删除,但使用 mediaStore,我仍然在列表中显示该文件。
【解决方案2】:

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

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

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

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

【讨论】:

  • 这适用于应用程序而不是浏览器,这仍然适用吗?
  • 如我所说,如果应用程序使用内置组件通过http下载资源,通常使用本地浏览器缓存。有时他们实现了自己的浏览器缓存,所以看看他们的选项,也许有办法清除缓存。
猜你喜欢
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多