我正在寻找一种方法来测试我是否可以打开某个意图。我知道如何测试某个操作是否可用,如in this example。然而,这不够好,因为像Intent.ACTION_VIEW这样的动作可能会根据所提供的uri打开不同的应用程序。
以防万一:
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url);
startActivity(i);
这将为不同的网址打开不同的应用,例如:
url = "ftp://192.168.1.1"
url = "http://192.168.1.1"
http url非常安全:它将在默认的Web浏览器中打开。 ftp url不是这样,因为它不确定用户是否安装了ftp客户端(对于我的情况,我假设AndFTP作为客户端,因为它似乎是最受欢迎的客户端之一,并且没有标准的方式来发送un / pw到客户端所以这必须是应用程序特定的。)
所以现在我不仅要测试操作是否可用(如果http可用,链接的代码将返回true,但ftp不返回),还要测试是否有可以处理特定种类的应用程序。对特定应用程序的测试也是可以接受的。
最后,这应该包含在一段代码中,该代码可以从中选择一个或多个URI,这应该打开第一个可能的URI,如果没有URI可以打开则返回错误代码。像这样的伪代码:
success = false;
for (Uri uri : uris) {
if (actionAvailable(uri)) {
// set up intent
startActivity(intent);
success = true;
break;
}
}
return success;
答案 0 :(得分:9)
所以现在我不仅要测试操作是否可用(如果http可用,链接的代码将返回true,但不是ftp),还要测试是否有可以处理特定种类的应用程序。
正如@mibollma指示的那样,使用PackageManager
和queryIntentActivities()
,为Intent
提供您要与startActivity()
一起使用的queryIntentActivities()
,并附上您的网址。如果Intent
返回空列表,则表示该<intent-filter>
没有匹配项。例如,如果没有任何ftp
支持{{1}}方案,您将获得一个空列表。
对于我的情况我假设AndFTP作为客户端,因为它似乎是最受欢迎的客户端之一,并且没有标准方法将un / pw发送到客户端,因此这必须是特定于应用程序的
然后不支持FTP。或者,嵌入自己的FTP支持,而不是依赖于可能不存在的,不兼容的第三方应用程序。