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?


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 .


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


1
il semble que tant qu'il a http://ou https://il reviendra vrai
hehe

Cela aiderait-il à éviter les URL telles que mailto: abc@xyz.com et about: blank # bloqué
RamPrasadBismil

69
URLUtil.isValidUrl(url);

Si cela ne fonctionne pas, vous pouvez utiliser:

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

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

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.


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

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

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


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
}


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.


2

Ajoutez simplement cette ligne de code:

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

0
new java.net.URL(String) throws MalformedURLException
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.