So überprüfen Sie, ob die URL in Android gültig ist

88

Gibt es eine gute Möglichkeit, den Fehler "Host ist nicht behoben" zu vermeiden, der eine App zum Absturz bringt? Eine Möglichkeit, eine Verbindung zu einem Host (wie einer URL) herzustellen und festzustellen, ob diese überhaupt gültig ist?

Kidalex
quelle
Wie verbindest du dich mit dem Host?
SteelBytes

Antworten:

185

Verwenden Sie URLUtil , um die URL wie folgt zu überprüfen .

 URLUtil.isValidUrl(url)

Es wird True zurückgegeben, wenn die URL gültig ist, und false, wenn die URL ungültig ist .

dd619
quelle
isValidUrl gibt false für die folgende URL zurück, obwohl das Gerät damit zufrieden zu sein scheint (es fehlt der doppelte Schrägstrich nach der Datei :). "Datei: /storage/emulated/0/Android/data/com.samsung.android.app.pinboard/files/ClipData/Screenshot_NormarAppImage.png"
Tom Hamshere
7
Ich würde mich nicht auf diese Methode verlassen, da sie keine gründliche Validierung durchführt, sondern nur die meisten einfachen WebView-Fälle. Siehe Quelle
marwinXXII
14
Bessere Antwort: stackoverflow.com/questions/5617749/…
marwinXXII
1
es scheint, dass solange es hat http://oder https://es wahr zurückkehren wird
hehe
Würde dies helfen, URLs wie mailto: [email protected] und about: blank # blockiert zu
vermeiden
67
URLUtil.isValidUrl(url);

Wenn dies nicht funktioniert, können Sie Folgendes verwenden:

Patterns.WEB_URL.matcher(url).matches();
Pranav
quelle
Überprüft dies nicht nur das Muster und nicht, ob die URL tatsächlich aktiv ist?
Declan McKenna
1
Soweit ich weiß, sollten wir mit der HttpURLConnection-Klasse manuell prüfen, ob die URL tatsächlich pingt oder nicht.
Pranav
Verwenden Sie die zweite Option, wenn Sie URLs ohne Schema überprüfen müssen. URLUtil.isValidUrl gibt false zurück, wenn kein Schema hinzugefügt wird.
user3783123
Wie man die URL überprüft, ist https:////testtovation.com
Manikandan K
16

Ich würde eine Kombination der hier und in anderen Stackoverflow-Threads erwähnten Methoden verwenden:

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;
}
Ayaz Alifov
quelle
5

Wickeln Sie den Vorgang in einen Versuch / Fang. Es gibt viele Möglichkeiten, wie eine URL wohlgeformt, aber nicht abrufbar sein kann. Darüber hinaus garantieren Tests wie das Überprüfen, ob der Hostname vorhanden ist, nichts, da der Host unmittelbar nach der Überprüfung möglicherweise nicht mehr erreichbar ist. Grundsätzlich kann keine Vorabprüfung garantieren, dass der Abruf nicht fehlschlägt und eine Ausnahme auslöst. Planen Sie daher besser, die Ausnahmen zu behandeln.

niemand
quelle
Es macht mir nichts aus, die Ausnahme zu behandeln, aber wie kann ich verhindern, dass die App aufgrund dieser Ausnahme abstürzt?
Kidalex
4
@kidalex Err, fangen Sie die Ausnahme? Was könnte "Behandlung der Ausnahme" sonst noch bedeuten?
Marquis von Lorne
4

Ich habe viele Methoden ausprobiert. Und finde, dass niemand mit dieser URL gut funktioniert :

Jetzt benutze ich folgendes und alles geht gut.

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;
}
androidyue
quelle
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;
            }
Krzysztof Dziuba
quelle
4

In meinem Fall Patterns.WEB_URL.matcher(url).matches()funktioniert es nicht richtig, wenn ich Stringähnlich wie "first.secondword" tippe (Meine App überprüft Benutzereingaben). Diese Methode gibt true zurück.

URLUtil.isValidUrl(url)funktioniert bei mir richtig. Vielleicht wäre es jemand anderem nützlich

Jackky777
quelle
4

Wenn Sie von verwenden kotlin, können Sie einen String.ktCode erstellen und unten schreiben:

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

Dann:

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

Sie können die URL folgendermaßen überprüfen:

Patterns.WEB_URL.matcher(potentialUrl).matches()
Muhammad Naeem Paracha
quelle
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;
    }
}

Dies ist die richtige Lösung, die ich verwende. Das Hinzufügen https://vor dem Originaltext verhindert, dass Text wie "www.cats.com" als betrachtet wird URL. Wenn dies new URL()erfolgreich ist, überprüfen Sie das Muster, um einfache Texte wie " https: // Katzen " auszuschließen , die berücksichtigt werden sollen URL.

Chirila Vasile
quelle
1

Fügen Sie einfach diese Codezeile hinzu:

Boolean isValid = URLUtil.isValidUrl(url) && Patterns.WEB_URL.matcher(url).matches();       
Prabhu
quelle
0
new java.net.URL(String) throws MalformedURLException
Kreker
quelle