programacion - Cómo verificar si la URL es válida en Android
manual de android en pdf (8)
¿Hay una buena forma de evitar el error de "host no resuelto" que bloquea una aplicación? ¿Algún tipo de forma de intentar conectarse a un host (como una URL) y ver si es incluso válido?
camino fácil
Use el patrón WEB_URL en la clase de patrones
Patterns.WEB_URL.matcher(potentialUrl).matches()
Devolverá True si la URL es válida y falsa si la URL no es válida .
Respuesta larga
A partir de Android API nivel 8 hay un patrón de WEB_URL . Citando la fuente, "coincide con la mayor parte de RFC 3987". Si se dirige a un nivel de API más bajo, simplemente copie el patrón de la fuente e inclúyalo en su aplicación. Supongo que sabes cómo usar patrones y combinaciones, así que no entraré en más detalles aquí.
Además, la clase URLUtil proporciona algunos métodos útiles, por ejemplo:
Las descripciones de los métodos no son muy elaboradas, por lo tanto, probablemente sea mejor que busque la fuente y descubra cuál se ajusta mejor a su propósito.
En cuanto a cuándo activar la verificación de validación, hay múltiples posibilidades: puede usar las funciones de devolución de llamada EditText
o use un TextWatcher , que creo que sería mejor.
NO USE URLUtil para validar la URL de la siguiente manera.
URLUtil.isValidUrl(url)
porque da cadenas como "http: //" como URL válida que no es verdadera
En mi caso, Patterns.WEB_URL.matcher(url).matches()
no funciona correctamente en el caso cuando escribo String
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 sería útil para otra persona
Envuelva la operación en un try / catch. Hay muchas maneras en que una URL puede estar bien formada pero no recuperable. Además, las pruebas como ver si el nombre de host existe no garantiza nada porque el host podría no ser accesible justo después de la comprobación. Básicamente, ninguna cantidad de verificación previa puede garantizar que la recuperación no fallará y emitirá una excepción, por lo que es mejor que planee manejar las excepciones.
He intentado 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;
}
Use URLUtil para validar la URL de la siguiente manera.
URLUtil.isValidUrl(url)
Devolverá True si la URL es válida y falsa si la URL no es válida .
Utilizaría una combinación de métodos mencionados aquí y en otros hilos de :
private boolean isValid(String urlString)
{
try
{
URL url = new URL(urlString);
return URLUtil.isValidUrl(urlString) && Patterns.WEB_URL.matcher(urlString).matches();
}
catch (MalformedURLException e)
{
}
return false;
}
URLUtil.isValidUrl(url)
Si esto no funciona, puede usar:
Patterns.WEB_URL.matcher(url).matches()
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;
}