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?


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


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


1
parece que mientras lo haya hecho http://o https://volverá a ser cierto
jeje

¿Ayudaría esto a evitar direcciones URL como mailto: abc@xyz.com y about: blank # bloqueado
RamPrasadBismil

69
URLUtil.isValidUrl(url);

Si esto no funciona, puede usar:

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

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

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.


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

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

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


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
}


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.


2

Simplemente agregue esta línea de código:

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

0
new java.net.URL(String) throws MalformedURLException
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.