Jak sprawdzić, czy adres URL jest prawidłowy w systemie Android


92

Czy istnieje dobry sposób na uniknięcie błędu „host nie został rozwiązany”, który powoduje awarię aplikacji? Jakiś sposób, aby spróbować połączyć się z hostem (na przykład adres URL) i sprawdzić, czy jest w ogóle prawidłowy?


jak łączysz się z hostem?
SteelBytes,

Odpowiedzi:


193

Użyj URLUtil, aby zweryfikować adres URL, jak poniżej.

 URLUtil.isValidUrl(url)

Zwróci True, jeśli adres URL jest prawidłowy, lub false, jeśli URL jest nieprawidłowy .


isValidUrl zwraca wartość false dla następującego adresu URL, chociaż urządzenie wydaje się być z niego zadowolone (brakuje podwójnego ukośnika po pliku :). „file: /storage/emulated/0/Android/data/com.samsung.android.app.pinboard/files/ClipData/Screenshot_NormarAppImage.png”
Tom Hamshere,

7
Nie polegałbym na tej metodzie, ponieważ nie przeprowadza ona głębokiej walidacji, tylko większość prostych przypadków WebView. Zobacz źródło
marwinXXII


1
wygląda na to, że tak długo, jak będzie, http://czy https://wróci prawda
hehe

Czy pomogłoby to uniknąć adresów URL takich jak mailto: abc@xyz.com i about: blank #
locked

69
URLUtil.isValidUrl(url);

Jeśli to nie zadziała, możesz użyć:

Patterns.WEB_URL.matcher(url).matches();

Czy to nie tylko sprawdza wzorzec, a nie to, czy adres URL jest rzeczywiście aktywny?
Declan McKenna

1
O ile wiem, jeśli musimy sprawdzić, czy adres URL faktycznie pinguje, czy nie, powinniśmy ręcznie sprawdzić to za pomocą klasy HttpURLConnection.
Pranav

Użyj drugiej opcji, jeśli chcesz sprawdzić adresy URL bez schematu. URLUtil.isValidUrl zwróci wartość false, jeśli schemat nie zostanie dodany.
user3783123

Jak sprawdzić adres URL: https:////testtovation.com
Manikandan K

18

Użyłbym kombinacji wymienionych tutaj metod oraz w innych wątkach Stackoverflow:

private boolean isValid(String urlString) {
    try {
        URL url = new URL(urlString);
        return URLUtil.isValidUrl(url) && Patterns.WEB_URL.matcher(url).matches();
    } catch (MalformedURLException e) {

    }

    return false;
}

5

Zawiń operację w try / catch. Adres URL może być dobrze sformułowany, ale nie można go odzyskać na wiele sposobów. Ponadto testy, takie jak sprawdzenie, czy nazwa hosta istnieje, niczego nie gwarantują, ponieważ host może stać się niedostępny zaraz po sprawdzeniu. Zasadniczo żadna ilość wstępnego sprawdzania nie gwarantuje, że pobieranie nie powiedzie się i nie zgłosi wyjątku, więc lepiej zaplanuj obsługę wyjątków.


Nie mam nic przeciwko obsłudze wyjątku, ale jak zapobiec awariom aplikacji z powodu tego wyjątku?
kidalex,

4
@kidalex Err, złapać wyjątek? Co jeszcze może oznaczać „obsługa wyjątku”?
Markiz Lorne

4

Wypróbowałem wiele metod i stwierdziłem, że nikt nie działa dobrze z tym adresem URL:

Teraz używam następujących i wszystko idzie dobrze.

public static boolean checkURL(CharSequence input) {
    if (TextUtils.isEmpty(input)) {
        return false;
    }
    Pattern URL_PATTERN = Patterns.WEB_URL;
    boolean isURL = URL_PATTERN.matcher(input).matches();
    if (!isURL) {
        String urlString = input + "";
        if (URLUtil.isNetworkUrl(urlString)) {
            try {
                new URL(urlString);
                isURL = true;
            } catch (Exception e) {
            }
        }
    }
    return isURL;
}

4
import okhttp3.HttpUrl;
import android.util.Patterns;
import android.webkit.URLUtil;

            if (!Patterns.WEB_URL.matcher(url).matches()) {
                error.setText(R.string.wrong_server_address);
                return;
            }

            if (HttpUrl.parse(url) == null) {
                error.setText(R.string.wrong_server_address);
                return;
            }

            if (!URLUtil.isValidUrl(url)) {
                error.setText(R.string.wrong_server_address);
                return;
            }

            if (!url.substring(0,7).contains("http://") & !url.substring(0,8).contains("https://")) {
                error.setText(R.string.wrong_server_address);
                return;
            }

4

W moim przypadku Patterns.WEB_URL.matcher(url).matches()nie działa poprawnie w przypadku gdy piszę Stringpodobnie do „first.secondword” (moja aplikacja sprawdza dane wprowadzone przez użytkownika). Ta metoda zwraca wartość true.

URLUtil.isValidUrl(url)działa poprawnie dla mnie. Może przydałoby się to komuś innemu


4

Jeśli korzystasz z from kotlin, możesz utworzyć String.kti napisać kod poniżej:

fun String.isValidUrl(): Boolean = Patterns.WEB_URL.matcher(this).matches()

Następnie:

String url = "www.yourUrl.com"
if (!url.isValidUrl()) {
    //some code
}else{
   //some code
}

3

Możesz sprawdzić poprawność adresu URL, wykonując następujące czynności:

Patterns.WEB_URL.matcher(potentialUrl).matches()

2
public static boolean isURL(String text) {
    String tempString = text;

    if (!text.startsWith("http")) {
        tempString = "https://" + tempString;
    }

    try {
        new URL(tempString).toURI();
        return Patterns.WEB_URL.matcher(tempString).matches();
    } catch (MalformedURLException | URISyntaxException e) {
        e.printStackTrace();
        return false;
    }
}

To jest właściwe rozwiązanie, którego używam. Dodanie https://tekstu przed oryginalnym tekstem zapobiega traktowaniu tekstu takiego jak „www.cats.com” jako URL. Jeśli się new URL()powiedzie, po prostu sprawdź wzorzec, aby wykluczyć proste teksty, takie jak „ https: // koty ”, które mają być brane pod uwagę URL.


2

Po prostu dodaj tę linię kodu:

Boolean isValid = URLUtil.isValidUrl(url) && Patterns.WEB_URL.matcher(url).matches();       

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.