2011-07-04 88 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