如何检查是否存在可以打开特定文件的应用

时间:2019-01-10 21:01:44

标签: android openfiledialog android-package-managers

我目前仍处在这种情况下,对于这个特定问题似乎没有要求。

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

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

我已经第一次打开这些应用程序,以防万一这是一个障碍,但我仍然无法使它正常工作。

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

getPackageManager().queryIntentActivities(intent, 0);

这永远都行不通,它总是返回0个活动,但是,一旦我安装了专用的文本编辑器,就会在查询中返回一个活动,但是只有一个。但是,一旦我进入提示菜单,它就会列出3种打开文本文件的方式:chrome浏览器,html编辑器和文本编辑器。

因此,它已将Chrome浏览器和html编辑器识别为能够在提示时读取.txt文件,但查询显然无法做到这一点。

这就是我建立意图的方式:

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

queryIntentActivities显然不能正常工作时,如何确定是否存在能够打开文件的应用?

2 个答案:

答案 0 :(得分:2)

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

此外,在没有URI的情况下,这在设备之间也可能有所不同,因为在我的设备上使用您的代码后,即使在使用文本编辑器之前或之后,我什至都看不到Chrome和HTML编辑器。是的,很奇怪。

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

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

但是,如果您在检查此解析之前确实具有有效的URI,那么我看不到您的问题。是否使用伪造的URI,我能够看到所有可以处理它的应用程序。

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

答案 1 :(得分:0)

我不确定queryIntentActivities为何每次都会返回0结果。您尝试过其他方法吗?尝试卸载文本编辑器应用程序,然后查看它是否将返回正确的值:

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