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;
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
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