【问题标题】:How to delete PDF files from the Documents folder via a MediaStore Uri如何通过 MediaStore Uri 从 Documents 文件夹中删除 PDF 文件
【发布时间】:2020-02-12 13:55:45
【问题描述】:

我正在创建 PDF 文件并将它们存储在默认的 Documents 文件夹中,仅适用于 MediaStore Uris,不适用于 SAF。假设我已经拥有所有必需/授予的读写权限,并且我是正在创建和删除的文件的所有者。

对于低于 Android Q 的 API 级别,删除 PDF 文件(mime 类型:application/pdf),仅当该文件位于设备的 中时才会失败文档文件夹。

要完全删除它,我发现唯一可行的方法是首先从 MediaStore 中删除它,然后删除文件:

String filePath = helper.getPathFromMediaStore() // Get the path before removing from the MediaStore
contentResolver.delete(targetUri, null, null) // Remove from the MediaStore
new File(filePath).delete() // Remove from disk

这 2 步删除操作已经看起来像一个丑陋的 hack,因为 File.delete() 不应该是必需的。

为了让事情变得更复杂,在 Android Q 中,不能使用第二步 File.delete(),因为 MediaStore.DATA 列已被弃用。

如果 PDF 文件被放置在 Downloads 文件夹中,那么这些文件可以在所有 API 级别中被删除,但在 Android Q 以下的 API 中,仍然需要第二步 File.delete()。

结论,位于 Documents 目录中的 PDF 文件只会从 MediaStore 中删除,但除非使用 File.delete() hack,否则它们会保留在磁盘上,并且不能在 Android Q 中使用。

那么,是否有任何特定要求能够从 Documents 文件夹中删除 拥有的文件,仅使用 MediaStore Uris,适用于所有 API 级别,并且不使用 File。删除操作?

【问题讨论】:

  • “它仍然包含文件路径,所以获取它没有问题”——它是从MediaStore 查询中编辑的,至少在我的测试中是这样。在 Android 10 上,您无论如何都无法访问该路径的文件系统。
  • File.delete() 只是一个我希望在所有 Android 版本中避免的 hack。主要问题是,当我是创建者甚至在 Android Q 中设置为所有者时,为什么无法完全删除 Documents 目录中的 PDF 文件。通过不删除,我的意思是,它们是使用从 MediaStore 中删除的ContentResolver.delete(Uri, ...),但文件仍保留在磁盘上。
  • 我不知道您所说的成为 Android 10 上外部存储根目录下的 Documents/ 目录中文件的“所有者”是什么意思。您的应用应该没有读写能力到 Android 10 上的那个目录。无论如何,MediaStore 应该与 Android 10 上的 Documents/ 无关(它只是回到媒体,加上 Downloads/ 出于某种莫名其妙的原因)。
  • 这很奇怪,因为我可以在这样的目录中创建文件而完全没有问题。需要提到的是,在 Android 10 中,我使用 RELATIVE_PATH 字段来设置目标,在本例中为 Environment.DIRECTORY_DOCUMENTS + "/PDF"。为了取回 Uris,我使用 MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL)" 查询 ContentResolver,它确实返回了所有拥有的 PDF,因此不包括其他应用程序创建的文件。
  • 您找到解决方案了吗?我有完全相同的问题,但图像,视频和音乐。我不拥有这些文件。我尝试通过 getContentResolver().delete() 删除它们。我得到 RecoverableSecurityException,处理它,系统显示对话框让用户让我访问这个文件,结果我重试删除并且它成功后,媒体存储中不存在图像/视频/音乐,但如果我检查存在 pn 文件系统通过 SAF 或通过文件管理器。当我重新启动手机文件再次出现在 MediaStore 中。我使用范围存储

标签: android pdf delete-file mediastore


【解决方案1】:

我也遇到了这个问题。我目前的解决方案是

对于 Android Q (API 29):我额外设置了 android:requestLegacyExternalStorage="true"。

因此。 new File(filePath).delete() // 从磁盘中删除,可以在Android Q上运行

适用于 Android R(API 30 或更高版本) 我只是使用 contentResolver.delete(targetUri, null, null)。 mediastore 记录和物理文件都可以删除。

可以引用https://developer.android.com/training/data-storage/use-cases 很复杂 针对 Android 11、Android 10 或 Android 9 更低版本

希望对你有帮助

【讨论】:

  • 这真的有效吗?如果你在文件资源管理器中查看文件,它不是还在吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多