意图ACTION_GET_CONTENT即使文件已被删除也会返回URI

6
我正在尝试在Android应用程序中阅读PDF文件。
发出以下意图以获取URI。
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("application/pdf");
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
startActivityForResult(intent, PDF_FILE_SELECTOR_INTENT_ID);

问题在于,“下载”文件夹中也显示了我已删除的旧文件。此外,当我选择这些文件时,onActivityResult() 返回一个有效的 URI。当我从 URI 创建 File 并检查 exists() 时,它返回 false,这是有道理的,因为我已经从“下载”文件夹中删除了该文件。
我如何确保在 ACTION_GET_CONTENT 上显示的“下载”文件夹只显示当前存在而未被删除的文件?
谢谢。

这是预期的行为。URI并不会立即更新,因此它们可能指向null、不存在或甚至是不同类型的目标(音频、图像等)。 - Bonatti
你难道不需要一个内容提供者来为你完成这个任务吗? - keepTrackOfYourStack
你正在测试哪个设备?安卓操作系统的版本是多少? - Priyanka
2个回答

2

不要使用intent.setType("application/pdf");,而是在putExtra中使用Intent.EXTRA_MIME_TYPES。

Java代码示例:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");
        intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {
                "application/pdf", // .pdf
        });
        startActivityForResult(intent, REQUEST_CODE);

在 Kotlin 中

startActivityForResult(
        Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
            addCategory(Intent.CATEGORY_OPENABLE)
            type = "*/*"
            putExtra(Intent.EXTRA_MIME_TYPES, arrayOf(
                    "application/pdf", // .pdf
            ))
        },
        REQUEST_CODE
      )
更新:在这种情况下,实际下载文件夹和“Downloads”文件夹是不同的。

Download是用于存放您实际下载的文件的文件夹,而Downloads是一个历史记录文件夹,类似于快捷方式。当手动删除指向的实际文件时,该文件夹不会自动清除。这可能是最常见的预期行为。

在您的情况下,您需要隐藏downloads文件夹(仍然可以使用Download)。使用此行代码将默认显示“内部存储器”:

intent.putExtra("android.content.extra.SHOW_ADVANCED", true);

对我来说,使用代码后,已经删除的文件夹仍然显示在“下载”中。如何刷新? - Minimus Heximus

0

即使使用了CATEGORY_OPENABLE,仍然会显示许多先前已删除的文件... - Minimus Heximus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接