¿Existe una buena manera de evitar el error "host no resuelto" que bloquea una aplicación? ¿Alguna forma de intentar conectarse a un host (como una URL) y ver si es válido?
Respuestas:
Utilice URLUtil para validar la URL como se muestra a continuación.
URLUtil.isValidUrl(url)
Devolverá True si la URL es válida y falso si la URL no es válida .
http://
o https://
volverá a ser cierto
URLUtil.isValidUrl(url);
Si esto no funciona, puede usar:
Patterns.WEB_URL.matcher(url).matches();
Usaría una combinación de métodos mencionados aquí y en otros hilos de 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;
}
Envuelva la operación en un try / catch. Hay muchas formas en que una URL puede estar bien formada pero no recuperable. Además, las pruebas como ver si existe el nombre de host no garantizan nada porque el host podría volverse inalcanzable justo después de la verificación. Básicamente, ninguna cantidad de verificación previa puede garantizar que la recuperación no fallará y generará una excepción, por lo que es mejor que planee manejar las excepciones.
He probado muchos métodos y descubro que nadie funciona bien con esta URL:
Ahora uso lo siguiente y todo va 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;
}
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;
}
En mi caso Patterns.WEB_URL.matcher(url).matches()
, no funciona correctamente en el caso en que String
escribo similar a "first.secondword" (Mi aplicación verifica la entrada del usuario). Este método devuelve verdadero.
URLUtil.isValidUrl(url)
funciona correctamente para mí. Tal vez sea útil para alguien más
Puede validar la URL siguiendo:
Patterns.WEB_URL.matcher(potentialUrl).matches()
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;
}
}
Esta es la solución correcta que estoy usando. Agregar https://
antes del texto original evita que texto como "www.cats.com" se considere como URL
. Si tiene new URL()
éxito, entonces si simplemente marca el patrón para excluir textos simples como " https: // gatos " para ser considerados URL
.