如何使用 queryIntentActivities() 获取 Google Drive 以显示?

How to get Google Drive to show with queryIntentActivities()?

在我们的应用程序中,我们尝试从其他文件存储应用程序获取文件。因此,例如,打开我们的应用程序,启动应用程序选择器,select 保管箱,select 文件,在我们的应用程序中打开文件。

我已将此意图设置为尝试调用其他应用程序:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);

重要的部分是 queryIntentActivities,我们使用这个 returns 的应用程序列表来显示我们的用户可以选择的应用程序。 Dropbox 和 Microsoft OneDrive 等应用程序显示没有问题,但我 Google Drive 从未显示。

我需要在意图中设置什么才能让 Google 驱动器返回 queryIntentActivities

在 Android KitKat (API 19) 和更高版本的设备上,应用程序可以使用 Storage Access Framework and build a DocumentsProvider。在这些情况下,当您使用 ACTION_GET_CONTENT 意图调用 startActivity() 时,系统 UI 会提供 UI - 应用程序不需要实现自己的 UI 也有一个直接处理 GET_CONTENT.

的 Activity

由于系统 UI 提供对使用存储访问框架的应用程序和仅提供 GET_CONTENT Activity 的旧版应用程序的访问权限,您应该 拥有自己的应用程序选择器,而不是直接执行 ACTION_GET_CONTENT Intent,它将适用于所有应用程序(并允许用户 select 来自多个 DocumentsProvider 的文件,而不是如果您设置了 EXTRA_ALLOW_MULTIPLE 标志,则仅来自单个应用。

将数据 URI 设置为意图,然后检查 queryIntentActivity。

下面的代码片段,也将 Google Drive as ChooserIntent。

val packageManager = context.packageManager
val intent = Intent(Intent.ACTION_VIEW)
intent.setDataAndType(uri, "application/pdf")
        if (packageManager.queryIntentActivities(
                intent,
                PackageManager.MATCH_DEFAULT_ONLY
            ).size > 0) {
            // PDF reader exists
            return true
        }
        // No PDF reader
        return false
}