2011-07-04 25 views
5

Szukam sposobu na sprawdzenie, czy mogę otworzyć określony zamiar. Wiem, jak sprawdzić, czy dostępne jest działanie, takie jak in this example. Jednak nie jest to wystarczająco dobre, jak w przypadku działania Intent.ACTION_VIEW może otwierać różne aplikacje w zależności od przedstawionego interfejsu użytkownika.Sprawdź, czy intencja jest dostępna.

Punkt w przypadku:

Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url); 
startActivity(i); 

To otworzy inną aplikację dla różnych adresów URL, takich jak:

url = "ftp://192.168.1.1" 
url = "http://192.168.1.1" 

http url jest całkiem bezpieczne: który zostanie otwarty w domyślnej przeglądarce internetowej . Adres URL FTP nie jest taki, ponieważ nie jest pewne, czy użytkownicy mają zainstalowanego klienta ftp (dla mojego przypadku zakładam, że AndFTP jest klientem, który wydaje się być jednym z najpopularniejszych klientów, i nie ma standardowego sposobu wysyłania/pw do klienta, więc musi to być specyficzne dla aplikacji).

Teraz chciałbym przetestować nie tylko, czy akcja jest dostępna (kod połączony zwróci true, jeśli http jest dostępny, ale nie ftp), ale także, czy istnieje aplikacja, która może obsłużyć konkretną odmianę. Sprawdzanie konkretnej aplikacji byłoby również dopuszczalne.

Na koniec należy włączyć fragment kodu, który zawiera jeden lub więcej identyfikatorów URI do wyboru, który powinien otworzyć pierwszą możliwą i zwrócić kod błędu, jeśli nie można otworzyć żadnych identyfikatorów URI. Coś jak ten pseudo-kod:

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

Nie bardzo rozumiem problem. Filtr intent powinien wskazywać, czy obsługuje on protokół http lub ftp, więc myślę, że pierwsza przykładowa metoda, którą wysłałeś, powinna działać, czy nie działa? http://developer.android.com/guide/topics/manifest/data-element.html#scheme – mibollma

+0

Problem polega na wykonaniu właściwego testu, czy intencja jest dostępna i czy jest obsługiwana. Zarówno ftp, jak i http (i wiele innych) są obsługiwane przez Intent.ACTION_VIEW. Złapanie błędu w programie startActivity nie jest rozwiązaniem. – Wouter

Odpowiedz

8

Więc teraz chciałbym przetestować nie tylko wtedy, gdy akcja jest dostępna (połączony kod zwróci true, jeśli jest dostępny, ale http ftp nie), ale także, czy istnieje aplikacja, która obsługuje konkretną odmianę.

Jak @mibollma wskazuje, użyj PackageManager i queryIntentActivities(), dostarczający go Intent że chcesz korzystać z startActivity(), wraz z adresu URL. Jeśli queryIntentActivities() zwróci pustą listę, wiesz, że nie ma dopasowania do tego Intent. Na przykład, jeśli nic nie ma schematu <intent-filter> obsługującego schemat ftp, otrzymasz pustą listę.

za moim przypadku jestem przy założeniu AndFTP jako klient, ponieważ wydaje się być jednym z najbardziej popularnych klientów, i nie ma standardowy sposób wysłać UN/pw do klienta, więc musi to być specyficzne dla aplikacji

Następnie nie obsługuj FTP. Lub osadzić własną obsługę FTP zamiast polegać na prawdopodobnie nieistniejącej, niekompatybilnej aplikacji innej firmy.

+0

Do przesyłania plików klienci FTP są zwykle znacznie lepsi niż przeglądarki internetowe. Dlatego chcę zaoferować opcję ftp, cofając się do http (wbudowana przeglądarka tak gwarantowana), jeśli nie jest dostępny żaden obsługiwany klient ftp. – Wouter

+0

@Wouter: Następnie załóż własną obsługę FTP zamiast polegać na prawdopodobnie nieistniejącej, niekompatybilnej aplikacji innej firmy. – CommonsWare