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

Existe-t-il un bon moyen d’éviter l’erreur “hôte non résolu” qui bloque 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?

Utilisez URLUtil pour valider l’URL ci-dessous.

URLUtil.isValidUrl(url) 

Il retournera True si l’URL est valide et false si l’URL n’est pas valide .

 URLUtil.isValidUrl(url) 

Si cela ne fonctionne pas, vous pouvez utiliser:

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

moyen facile

Utiliser le modèle WEB_URL dans la classe Patterns

  Patterns.WEB_URL.matcher(potentialUrl).matches() 

Il retournera True si l’URL est valide et false si l’URL n’est pas valide .

Longue réponse

À partir du niveau 8 de l’API Android, il existe un modèle WEB_URL . Citant la source, il “correspond à la plus grande partie de la RFC 3987”. Si vous ciblez un niveau d’API inférieur, vous pouvez simplement copier le modèle à partir de la source et l’inclure dans votre application. Je suppose que vous savez utiliser des patterns et des matchers, alors je ne vais pas entrer dans plus de détails ici.

La classe URLUtil fournit également des méthodes utiles, par exemple:

  • isHttpUrl ()
  • isValidUrl ()

Les descriptions des méthodes ne sont pas très élaborées. Par conséquent, vous êtes probablement le mieux placé pour examiner la source et déterminer laquelle correspond le mieux à votre objective.

Quant au déclenchement de la validation, il existe plusieurs possibilités: vous pouvez utiliser les fonctions de rappel EditText

  • onFocusChanged () , ou
  • onTextChanged ()

ou utiliser un TextWatcher , ce que je pense serait mieux.

N’UTILISEZ PAS URLUtil pour valider l’URL ci-dessous.

  URLUtil.isValidUrl(url) 

car il donne des chaînes comme “http: //” comme URL valide qui n’est pas vraie

Enveloppez l’opération dans un try / catch. Il y a de nombreuses manières pour qu’une URL soit bien formée mais non récupérable. De plus, les tests comme 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 vérification préalable ne peut garantir que la récupération ne échouera pas et lancera une exception. Il est donc préférable de gérer les exceptions.

J’ai essayé beaucoup de méthodes. Et trouve que personne ne fonctionne bien avec cette URL:

Maintenant, j’utilise le suivant 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) { Ssortingng urlSsortingng = input + ""; if (URLUtil.isNetworkUrl(urlSsortingng)) { try { new URL(urlSsortingng); isURL = true; } catch (Exception e) { } } } return isURL; } 

J’utiliserais une combinaison de méthodes mentionnées ici et dans d’autres threads Stackoverflow:

 private boolean isValid(Ssortingng urlSsortingng) { try { URL url = new URL(urlSsortingng); return URLUtil.isValidUrl(urlSsortingng) && Patterns.WEB_URL.matcher(urlSsortingng).matches(); } catch (MalformedURLException e) { } return false; } 
 import okhttp3.HttpUrl; import android.util.Patterns; import android.webkit.URLUtil; if (!Patterns.WEB_URL.matcher(url).matches()) { error.setText(R.ssortingng.wrong_server_address); return; } if (HttpUrl.parse(url) == null) { error.setText(R.ssortingng.wrong_server_address); return; } if (!URLUtil.isValidUrl(url)) { error.setText(R.ssortingng.wrong_server_address); return; } if (!url.subssortingng(0,7).contains("http://") & !url.subssortingng(0,8).contains("https://")) { error.setText(R.ssortingng.wrong_server_address); return; } 

Dans mon cas, Patterns.WEB_URL.matcher(url).matches() ne fonctionne pas correctement dans le cas où je tape Ssortingng similaire à “first.secondword” (Mon application vérifie les entrées 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