意图ACTION_GET_CONTENT甚至返回已删除文件的uri

时间:2019-03-12 13:24:55

标签: android file android-intent android-contentprovider

我正在尝试在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);

问题是,Downloads文件夹还显示了我已删除的旧文件。 另外,当我选择这些文件时,将在uri中返回有效的onActivityResult()。当我从File创建uri并检查exists()时,它返回false,这很有意义,因为我已经从Downloads文件夹中删除了文件。

如何确保Downloads上显示的ACTION_GET_CONTENT文件夹仅显示当前存在的文件,而不显示已删除的文件?

谢谢。

2 个答案:

答案 0 :(得分:3)

代替

<块引用>

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
      )

更新:在这种情况下,实际下载文件夹和“下载”文件夹不同。

下载用于您实际下载的文件 下载是一个历史文件夹,就像一个快捷方式,当手动删除指向的实际文件时,它不会自动清除。这很可能是一种预期行为。

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

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

答案 1 :(得分:0)

按照此处的建议调用 addCategory(Intent.CATEGORY_OPENABLE) 到您的 Intent:https://developer.android.com/reference/android/content/Intent#ACTION_GET_CONTENT