Cómo comprobar si la URL es válida en Android

92

¿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?

kidalex
fuente
¿cómo te conectas al host?
SteelBytes

Respuestas:

193

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 .

dd619
fuente
isValidUrl devuelve falso para la siguiente URL, aunque el dispositivo parece bastante feliz con ella (falta la barra doble después del archivo :). "archivo: /storage/emulated/0/Android/data/com.samsung.android.app.pinboard/files/ClipData/Screenshot_NormarAppImage.png"
Tom Hamshere
7
No confiaría en este método, porque no realiza una validación profunda, solo la mayoría de los casos simples de WebView. Ver fuente
marwinXXII
14
Mejor respuesta: stackoverflow.com/questions/5617749/…
marwinXXII
1
parece que mientras lo haya hecho http://o https://volverá a ser cierto
jeje
¿Ayudaría esto a evitar direcciones URL como mailto: [email protected] y about: blank # bloqueado
RamPrasadBismil
69
URLUtil.isValidUrl(url);

Si esto no funciona, puede usar:

Patterns.WEB_URL.matcher(url).matches();
Pranav
fuente
¿Esto no solo verifica el patrón en lugar de si la URL está realmente activa?
Declan McKenna
1
Hasta donde yo sé, si necesitamos verificar si la URL realmente está haciendo ping o no, deberíamos verificarlo manualmente usando la clase HttpURLConnection.
Pranav
Use la segunda opción si necesita verificar las URL sin esquema. URLUtil.isValidUrl devolverá falso si no se agrega el esquema.
user3783123
Cómo verificar la URL es https:////testtovation.com
Manikandan K
18

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;
}
Ayaz Alifov
fuente
5

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.

nadie
fuente
No me importa manejar la excepción, pero ¿cómo puedo evitar que la aplicación se bloquee debido a esa misma excepción?
kidalex
4
@kidalex Err, coge la excepción? ¿Qué más podría significar posiblemente "manejar la excepción"?
Marqués de Lorne
4

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;
}
androidyue
fuente
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
fuente
4

En mi caso Patterns.WEB_URL.matcher(url).matches(), no funciona correctamente en el caso en que Stringescribo 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

Jackky777
fuente
4

Si está utilizando desde kotlin, puede crear un String.ktcódigo y escribirlo a continuación:

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

Entonces:

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

Puede validar la URL siguiendo:

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

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.

Chirila Vasile
fuente
2

Simplemente agregue esta línea de código:

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