Come verificare se l'URL è valido in Android


92

C'è un buon modo per evitare l'errore "host non risolto" che blocca un'app? Qualche modo per provare a connettersi a un host (come un URL) e vedere se è valido?


come ti connetti all'host?
SteelBytes

Risposte:


193

Usa URLUtil per convalidare l'URL come di seguito.

 URLUtil.isValidUrl(url)

Restituirà True se l'URL è valido e falso se l'URL non è valido .


isValidUrl restituisce false per il seguente URL, sebbene il dispositivo sembri abbastanza soddisfatto (manca la doppia barra dopo il file :). "file: /storage/emulated/0/Android/data/com.samsung.android.app.pinboard/files/ClipData/Screenshot_NormarAppImage.png"
Tom Hamshere

7
Non farei affidamento su questo metodo, perché non esegue una convalida profonda, solo i casi WebView più semplici. Vedi fonte
marwinXXII


1
sembra che finché ha http://o https://tornerà vero
hehe

Questo aiuterebbe ad evitare URL come mailto: abc@xyz.com e about: blank #
locked

69
URLUtil.isValidUrl(url);

Se questo non funziona puoi usare:

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

Questo non controlla solo il pattern piuttosto che se l'URL è effettivamente attivo?
Declan McKenna

1
Per quanto ne so, se dobbiamo verificare se l'URL sta effettivamente eseguendo il ping o meno, dovremmo verificarlo manualmente utilizzando la classe HttpURLConnection.
Pranav

Usa la seconda opzione se devi controllare gli URL senza schema. URLUtil.isValidUrl restituirà false se lo schema non viene aggiunto.
user3783123

Come controllare l'URL è https:////testtovation.com
Manikandan K

18

Userei una combinazione di metodi menzionati qui e in altri thread 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

Avvolgi l'operazione in una prova / cattura. Ci sono molti modi in cui un URL può essere ben formato ma non recuperabile. Inoltre, test come vedere se il nome host esiste non garantisce nulla perché l'host potrebbe diventare irraggiungibile subito dopo il controllo. Fondamentalmente, nessuna quantità di controllo preliminare può garantire che il recupero non fallisca e generi un'eccezione, quindi è meglio pianificare la gestione delle eccezioni.


Non mi dispiace gestire l'eccezione, ma come posso evitare che l'app si arresti in modo anomalo a causa di quella stessa eccezione?
Kidalex

4
@kidalex Err, cogli l'eccezione? Che altro potrebbe 'gestire l'eccezione' significare?
Marchese di Lorne

4

Ho provato molti metodi e ho scoperto che nessuno funziona bene con questo URL:

Ora uso quanto segue e tutto va bene.

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

Nel mio caso Patterns.WEB_URL.matcher(url).matches()non funziona correttamente nel caso in cui digitoString digito simile a "first.secondword" (la mia app controlla l'input dell'utente). Questo metodo restituisce true.

URLUtil.isValidUrl(url)funziona correttamente per me. Forse sarebbe utile a qualcun altro


4

Se stai usando from kotlinpuoi creare String.kte scrivere il codice qui sotto:

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

Poi:

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


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

Questa è la soluzione corretta che sto usando. L'aggiunta di https://testo prima dell'originale impedisce che il testo come "www.cats.com" venga considerato come URL. Se ha new URL()successo, se controlli il pattern per escludere testi semplici come " https: // cats " da considerare URL.


2

Basta aggiungere questa riga di codice:

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

0
new java.net.URL(String) throws MalformedURLException
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.