2011-07-04 37 views
5

我正在寻找一种方法来测试我是否可以打开某个意图。我知道如何测试一个动作是否可用,如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作为客户端,因为它似乎是最受欢迎的客户端之一,并且没有标准的发送方式/ pw给客户端,所以这必须是应用程序特定的)。

所以现在我想测试不仅如果行动是可用的(链接的代码将返回true,如果http可用但ftp不是),而且是否有一个应用程序可以处理特定的品种。测试特定的应用程序也是可以接受的。

最后,这应该被合并到一段代码中,该代码可以从一个或多个URI中进行选择,这应该会打开第一个URI,如果没有URI可以打开,则返回一个错误代码。事情是这样的伪代码:

success = false; 
for (Uri uri : uris) { 
    if (actionAvailable(uri)) { 
     // set up intent 
     startActivity(intent); 
     success = true; 
     break; 
    } 
} 
return success; 
+1

我不太明白这个问题。意图过滤器应该表明他们是否支持http或ftp,所以我认为你发布的第一个示例方法应该工作或不这样做? http://developer.android.com/guide/topics/manifest/data-element.html#scheme – mibollma

+0

问题是要做一个适当的测试,以确定意图是否可用并得到处理。 Intent.ACTION_VIEW处理ftp和http(以及更多)。在startActivity上捕获错误不是要走的路。 – Wouter

回答

8

所以现在我想测试不仅动作是否可用(如果HTTP是可用,但不是FTP链接的代码将返回true),也不管有一个应用程序可以处理特定的品种。

由于@mibollma表明,使用PackageManagerqueryIntentActivities(),提供它要与startActivity(),完成你的URL中使用的Intent。如果queryIntentActivities()返回空列表,则知道没有匹配Intent。例如,如果没有任何支持ftp方案的<intent-filter>,您将获得一个空列表。

我的情况,我假设AndFTP作为客户端,因为它似乎是最流行的客户之一,且有送联合国没有标准的方法/ PW的客户端,以便这必须是应用特定的

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

+0

对于文件传输,ftp客户端通常比Web浏览器好得多。这就是为什么我想提供ftp选项,如果没有支持的ftp客户端可用,则会返回到http(内置web浏览器,因此保证可用)。 – Wouter

+0

@Wouter:然后嵌入您自己的FTP支持,而不是依赖可能不存在的,不兼容的第三方应用程序。 – CommonsWare