Android 测试意图是否可用

Android 测试意图是否可用,android,android-intent,action,Android,Android Intent,Action,我正在寻找一种方法来测试我是否可以打开一个特定的意图。我知道如何测试一个动作是否可用。但是,这还不够好,因为像Intent.action\u视图这样的操作可能会根据显示的uri打开不同的应用程序 举例说明: Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url); startActivity(i); 这将为不同的URL打开不同的应用程序,例如: url = "ftp://192.168.1.1" url = "http://192.16

我正在寻找一种方法来测试我是否可以打开一个特定的意图。我知道如何测试一个动作是否可用。但是,这还不够好,因为像Intent.action\u视图这样的操作可能会根据显示的uri打开不同的应用程序

举例说明:

Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url);
startActivity(i);
这将为不同的URL打开不同的应用程序,例如:

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;
因此,现在我不仅要测试操作是否可用(如果http可用,链接代码将返回true,但ftp不可用),还要测试是否有一个应用程序可以处理特定的种类

正如@mibollma所指出的,使用
PackageManager
queryIntentActivities()
,为其提供您希望与
startActivity()
一起使用的
Intent
,以及您的URL。如果
queryIntentActivities()
返回一个空列表,您就知道该
意图不匹配。例如,如果没有支持
ftp
方案的
,您将得到一个空列表

在我的例子中,我假设AndFTP作为客户端,因为它似乎是最流行的客户端之一,并且没有标准的方式将un/pw发送到客户端,因此这必须是特定于应用程序的


然后不支持FTP。或者,嵌入您自己的FTP支持,而不是依赖可能不存在、不兼容的第三方应用。

我不太理解这个问题。意图过滤器应该指出它们是否支持http或ftp,所以我认为您发布的第一个示例方法应该有效,还是无效?问题是要对意图是否可用以及是否得到处理进行适当的测试。ftp和http(以及更多)都由Intent.ACTION\u视图处理。捕捉startActivity上的错误不是一个好办法。对于文件传输,ftp客户端通常比web浏览器好得多。这就是为什么我想提供ftp选项,如果没有受支持的ftp客户端可用,则返回http(保证可用的内置web浏览器)。@Wouter:然后嵌入您自己的ftp支持,而不是依赖可能不存在的、不兼容的第三方应用程序。