Esta sección fue aprobado por especialistas para asegurar la exactitud de nuestro contenido.
Solución:
Respuesta corta
Use el patrón WEB_URL en la clase de patrones
Patterns.WEB_URL.matcher(potentialUrl).matches()
regresará Verdadero si la URL es válida y false si la URL no es válida.
Respuesta larga
A partir del nivel 8 de la API de Android, existe un patrón WEB_URL. Citando la fuente, “coincide[es] la mayor parte de RFC 3987”. Si apunta a un nivel de API más bajo, simplemente puede copiar el patrón de la fuente e incluirlo en su aplicación. Supongo que sabe cómo usar patrones y comparadores, por lo que no voy a entrar en más detalles. aquí.
Además, la clase URLUtil proporciona algunos métodos útiles, por ejemplo:
- esHttpUrl()
- es una URL válida ()
Las descripciones de los métodos no son muy elaboradas, por lo tanto, probablemente sea mejor mirar la fuente y descubrir cuál se adapta mejor a su propósito.
En cuanto a cuándo activar la verificación de validación, existen múltiples posibilidades: podría usar las funciones de devolución de llamada de EditText
- onFocusChanged(), o
- onTextChanged()
o use un TextWatcher, que creo que sería mejor.
NO USARURLUtil para validar la URL como se muestra a continuación.
URLUtil.isValidUrl(url)
porque da cadenas como “http://” como URL válida que no es true
/**
* This is used to check the given URL is valid or not.
* @param url
* @return true if url is valid, false otherwise.
*/
private boolean isValidUrl(String url)
Pattern p = Patterns.WEB_URL;
Matcher m = p.matcher(url.toLowerCase());
return m.matches();
En caso de que, en su UnitTest, tenga NullPointerException
entonces usa PatternsCompat
en lugar de Patterns
.
fun isFullPath(potentialUrl: String): Boolean
return PatternsCompat.WEB_URL.matcher(potentialUrl.toLowerCase(Locale.CANADA)).matches()
Además, me di cuenta de que este método devuelve true
cuando lo paso Photo.jpg
. mi expectativa es false
. Por lo tanto, propongo el siguiente método en lugar del anterior.
fun isFullPath(potentialUrl: String): Boolean
try
URL(potentialUrl).toURI()
return true
catch (e: Exception)
e.printStackTrace()
return false