如何检查是否有可以打开某个文件的应用程序
How to check if there's an app that can open a certain file
我目前遇到了这种情况,似乎没有人针对这个特定问题提出任何问题。
我试图在下载后打开一个 .txt
文件,我想在实际下载之前检查用户是否有能够打开该文件的应用程序。
在我的模拟 phone 运行 API 26 上有一个原生的 HTML 编辑器可以打开文本文件和 Chrome 浏览器应用程序还有。
我已经第一次打开了这些应用程序,以防万一这可能是一个障碍,但我仍然无法让它工作。
检查文件是否可以打开我使用以下方法:
getPackageManager().queryIntentActivities(intent, 0);
这从来没有用过,它总是 returns 0 个活动,但是一旦我安装了专用的文本编辑器,那么查询中的那个 returns,但只有那个。但是,一旦我继续使用提示菜单,它会列出 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
明显无法正常工作时,如何确定是否确实存在能够打开文件的应用程序?
我不确定为什么 queryIntentActivities
return 老实说每次都是 0 个结果。您尝试过不同的方法吗?尝试卸载文本编辑器应用程序,然后查看这是否 return 正确的值:
if (intent.resolveActivity(getPackageManager()) == null) {
// Nothing can handle this intent
}
else{
// Something actually can
}
我不知道你是不是故意遗漏了 URI (setData()
),但是没有它,它就不能正常工作。
此外,如果没有 URI,这也可能因设备而异,因为在我的设备上使用您的代码,我什至看不到 Chrome 和 HTML 编辑器,无论是在我 dl 之前还是之后一个文本编辑器。是的,很奇怪。
无论如何,坚持你的代码,只需添加一个 虚拟 uri,你就可以提取所有正确的应用程序:
Uri uri = Uri.parse("content://dummy");
intent.setDataAndType(uri, "text/plain");
但是,如果您在检查此解析之前确实有一个有效的 URI,那么我看不到您的问题。不管是不是假URI,我都能看到所有可以处理它的应用程序。
旁注:如果 URI 有效,建议现在使用 FileProvider
,参见:
我目前遇到了这种情况,似乎没有人针对这个特定问题提出任何问题。
我试图在下载后打开一个 .txt
文件,我想在实际下载之前检查用户是否有能够打开该文件的应用程序。
在我的模拟 phone 运行 API 26 上有一个原生的 HTML 编辑器可以打开文本文件和 Chrome 浏览器应用程序还有。
我已经第一次打开了这些应用程序,以防万一这可能是一个障碍,但我仍然无法让它工作。
检查文件是否可以打开我使用以下方法:
getPackageManager().queryIntentActivities(intent, 0);
这从来没有用过,它总是 returns 0 个活动,但是一旦我安装了专用的文本编辑器,那么查询中的那个 returns,但只有那个。但是,一旦我继续使用提示菜单,它会列出 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
明显无法正常工作时,如何确定是否确实存在能够打开文件的应用程序?
我不确定为什么 queryIntentActivities
return 老实说每次都是 0 个结果。您尝试过不同的方法吗?尝试卸载文本编辑器应用程序,然后查看这是否 return 正确的值:
if (intent.resolveActivity(getPackageManager()) == null) {
// Nothing can handle this intent
}
else{
// Something actually can
}
我不知道你是不是故意遗漏了 URI (setData()
),但是没有它,它就不能正常工作。
此外,如果没有 URI,这也可能因设备而异,因为在我的设备上使用您的代码,我什至看不到 Chrome 和 HTML 编辑器,无论是在我 dl 之前还是之后一个文本编辑器。是的,很奇怪。
无论如何,坚持你的代码,只需添加一个 虚拟 uri,你就可以提取所有正确的应用程序:
Uri uri = Uri.parse("content://dummy");
intent.setDataAndType(uri, "text/plain");
但是,如果您在检查此解析之前确实有一个有效的 URI,那么我看不到您的问题。不管是不是假URI,我都能看到所有可以处理它的应用程序。
旁注:如果 URI 有效,建议现在使用 FileProvider
,参见: