【问题标题】:How to check if there's an app that can open a certain file如何检查是否有可以打开某个文件的应用程序
【发布时间】:2019-01-10 21:01:44
【问题描述】:

我目前遇到这种情况,似乎没有针对这个特定问题提出任何问题。

我正在尝试在下载后打开 .txt 文件,并且我想检查用户是否有能够在实际下载之前打开该文件的应用。

在我运行 API 26 的模拟手机上,有一个原生 HTML 编辑器,它能够打开文本文件和 Chrome 浏览器应用程序。

我已经第一次打开了这些应用程序,以防万一这可能是一个障碍,我仍然无法让它工作。

要检查文件是否可以打开,我使用以下方法:

getPackageManager().queryIntentActivities(intent, 0);

这永远不会奏效,它总是返回 0 个活动,但是一旦我安装了一个专用的文本编辑器,那么查询中就会返回一个,但只是一个。但是,一旦我继续使用提示菜单,它会列出 3 种打开文本文件的方法:chrome 浏览器、html 编辑器和文本编辑器。

因此它在提示时识别 chrome 浏览器和 html 编辑器能够读取.txt 文件,但查询显然无法这样做。

这就是我构建 Intent 的方式:

intent = new Intent(Intent.ACTION_VIEW);
intent.setType(fileExtension); // this can be a String .txt .pdf etc

queryIntentActivities 明显无法正常工作时,我如何才能知道是否确实存在能够打开文件的应用程序?

【问题讨论】:

  • 您可以分享您构建intent 的代码吗?
  • @TWL 我已经添加了用于构建意图的代码。
  • 您没有为您的意图提供URI
  • 如果文件尚未下载,则没有 URI。重点是在下载文件之前检查用户是否可以实际打开文件。这在我的第二段中进行了解释。

标签: android openfiledialog android-package-managers


【解决方案1】:

我不知道你是否有意遗漏了 URI (setData()),但没有它,它将无法正常工作。

此外,如果没有 URI,这也可能因设备而异,因为在我的设备上使用您的代码,我什至看不到 Chrome 和 HTML 编辑器,无论是在我使用文本编辑器之前还是之后。是的,这很奇怪。

无论如何,坚持您的代码,只需添加一个 dummy uri,您就可以提取所有正确的应用程序:

Uri uri = Uri.parse("content://dummy");
intent.setDataAndType(uri, "text/plain");

但是,如果您在检查此解析之前确实有一个有效的 URI,那么我看不到您的问题。不管是不是假的 URI,我都能看到所有可以处理它的应用程序。

旁注:如果 URI 有效,建议现在使用 FileProvider,请参阅:

【讨论】:

  • 完美。添加一个虚拟的 Uri 就可以了。我没有添加 Uri 的原因是因为当时没有下载文件,所以没有可用的 Uri,使用这种方法很有效。
【解决方案2】:

老实说,我不确定为什么 queryIntentActivities 每次都返回 0 个结果。您是否尝试过不同的方法?尝试卸载文本编辑器应用程序,然后查看是否会返回正确的值:

if (intent.resolveActivity(getPackageManager()) == null) {
    // Nothing can handle this intent
}
else{
    // Something actually can
}

【讨论】:

  • 那太不幸了...你的具体操作是什么让它在弹出窗口中显示 3 个不同的项目?你直接打开下载的文件吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2014-11-22
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多