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?


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 .


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


1
es scheint, dass solange es hat http://oder https://es wahr zurückkehren wird
hehe

Würde dies helfen, URLs wie mailto: abc@xyz.com 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();

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

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.


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

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

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


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
}


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.


1

Fügen Sie einfach diese Codezeile hinzu:

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

0
new java.net.URL(String) throws MalformedURLException
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.