Comment vérifier si l'URL est valide dans Android

92

Existe-t-il un bon moyen d'éviter l'erreur «l'hôte n'est pas résolu» qui plante une application? Une sorte de moyen d'essayer de se connecter à un hôte (comme une URL) et de voir si c'est même valide?

Kidalex
la source
comment vous connectez-vous à l'hôte?
SteelBytes

Réponses:

193

Utilisez URLUtil pour valider l'URL comme ci-dessous.

 URLUtil.isValidUrl(url)

Il retournera True si l'URL est valide et False si l'URL n'est pas valide .

dd619
la source
isValidUrl renvoie false pour l'URL suivante, bien que l'appareil en semble assez satisfait (il manque la double barre oblique après le fichier :). "file: /storage/emulated/0/Android/data/com.samsung.android.app.pinboard/files/ClipData/Screenshot_NormarAppImage.png"
Tom Hamshere
7
Je ne me fierais pas à cette méthode, car elle n'effectue pas de validation approfondie, uniquement la plupart des cas WebView simples. Voir la source
marwinXXII
14
Meilleure réponse: stackoverflow.com/questions/5617749/…
marwinXXII
1
il semble que tant qu'il a http://ou https://il reviendra vrai
hehe
Cela aiderait-il à éviter les URL telles que mailto: [email protected] et about: blank # bloqué
RamPrasadBismil
69
URLUtil.isValidUrl(url);

Si cela ne fonctionne pas, vous pouvez utiliser:

Patterns.WEB_URL.matcher(url).matches();
Pranav
la source
Cela ne vérifie-t-il pas seulement le modèle plutôt que si l'URL est réellement active?
Declan McKenna
1
Pour autant que je sache, si nous avons besoin de vérifier si l'URL est réellement en train de cingler ou non, nous devrions le vérifier manuellement en utilisant la classe HttpURLConnection.
Pranav
Utilisez la deuxième option si vous avez besoin de vérifier les URL sans schéma. URLUtil.isValidUrl retournera false si le schéma n'est pas ajouté.
user3783123
Comment vérifier l'URL est https:////testtovation.com
Manikandan K
18

J'utiliserais une combinaison de méthodes mentionnées ici et dans d'autres threads 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;
}
Ayaz Alifov
la source
5

Enveloppez l'opération dans un try / catch. Il existe de nombreuses façons dont une URL peut être bien formée mais pas récupérable. De plus, des tests comme voir si le nom d'hôte existe ne garantissent rien car l'hôte peut devenir inaccessible juste après la vérification. Fondamentalement, aucune quantité de pré-vérification ne peut garantir que la récupération n'échouera pas et ne lèvera pas d'exception.

personne
la source
Cela ne me dérange pas de gérer l'exception, mais comment empêcher l'application de planter à cause de cette exception?
kidalex
4
@kidalex Euh, attrapez l'exception? Que pourrait signifier d' autre «gérer l'exception»?
Marquis de Lorne
4

J'ai essayé beaucoup de méthodes et je trouve que personne ne fonctionne correctement avec cette URL:

Maintenant, j'utilise ce qui suit et tout se passe bien.

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
la source
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
la source
4

Dans mon cas Patterns.WEB_URL.matcher(url).matches()ne fonctionne pas correctement dans le cas où je tapeString similaire à "first.secondword" (Mon application vérifie l'entrée de l'utilisateur). Cette méthode renvoie true.

URLUtil.isValidUrl(url)fonctionne correctement pour moi. Peut-être que ce serait utile à quelqu'un d'autre

Jackky777
la source
4

Si vous utilisez de, kotlinvous pouvez créer un String.ktcode et écrire ci-dessous:

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

Ensuite:

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

Vous pouvez valider l'URL en suivant:

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

C'est la solution correcte que j'utilise. L'ajout https://avant le texte original empêche le texte comme "www.cats.com" d'être considéré comme URL. Si vous new URL()réussissez, alors si vous cochez simplement le modèle pour exclure les textes simples comme " https: // chats " à prendre en compte URL.

Chirila Vasile
la source
2

Ajoutez simplement cette ligne de code:

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