2011-02-05 33 views

Respuesta

4

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.

+0

No me importa manejar la excepción, pero ¿cómo evito que la aplicación se cuelgue debido a esa misma excepción? – kidalex

+1

@kidalex Err, * catch * la excepcion? ¿Qué * else * podría significar 'manejo de la excepción'? – EJP

106

Use URLUtil para validar la URL como a continuación.

URLUtil.isValidUrl(url) 

Volverá True si la URL es válida yfalsa si la URL no es válida.

+0

isValidUrl devuelve false para la siguiente URL, aunque el dispositivo parece lo suficientemente feliz con ella (le falta la barra doble después del archivo :). "file: /storage/emulated/0/Android/data/com.samsung.android.app.pinboard/files/ClipData/Screenshot_NormarAppImage.png" –

+4

No confiaría en este método, porque no realiza una validación profunda, solo casos más simples de WebView. Ver [fuente] (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.2_r1/android/webkit/URLUtil.java#URLUtil.isValidUrl%28java .lang.String% 29) – marwinXXII

+11

Mejor respuesta: http://stackoverflow.com/questions/5617749/how-to-validate-a-url-website-name-in-edittext-in-android/7754297 – marwinXXII

36
URLUtil.isValidUrl(url) 

Si esto no funciona, puede utilizar:

Patterns.WEB_URL.matcher(url).matches() 
+0

¿Esto no solo verifica el patrón en lugar de si la URL está realmente activa? – Deco

+1

Por lo que sé, si tenemos que verificar si la URL realmente está sonando o no, deberíamos verificarla manualmente usando la clase HttpURLConnection. – Pranav

2

he probado un montón de methods.and encontrar que nadie trabaja bien con this URL:

Ahora uso el 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; 
} 
+0

esto no trabajo para mí. –

17

manera fácil

patrón de uso URL_web en los patrones de la clase

Patterns.WEB_URL.matcher(potentialUrl).matches() 

Volverá True si la URL es válida yfalsa si la URL no es válida.

Respuesta larga

A partir del nivel de la API de Android 8 hay un patrón 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í.

también la clase URLUtil proporciona algunos métodos útiles, por ejemplo:

Las descripciones de los métodos no son muy elaborados, por lo tanto, usted es probablemente mejor de mirar la fuente y averiguar cuál se adapta mejor a su propósito.

En cuanto a cuándo desencadenar la comprobación de validación, hay varias posibilidades: puede utilizar las funciones de devolución de EditText

o utilizar un TextWatcher, que Creo que sería mejor

NO USEURLUtil para validar la dirección URL de la siguiente manera.

URLUtil.isValidUrl(url) 

porque da cadenas, como "http: //" como URL válida que no es cierto

+0

En realidad, URLUtil.isValid ("http: //") devuelve falso cuando lo llamo en API 22. –

+4

Debería haber vinculado a esto: http://stackoverflow.com/a/5930532/957245 – Deco

+0

Patterns.WEB_URL.matcher (potentialUrl) .matches() rompió el Intent.ACTION_VIEW en android con url www ..., el URLUtil.isValidUrl es una mejor opción. – Josinaldo

0

me gustaría utilizar una combinación de métodos mencionados aquí y en otros hilos Stackoverflow:

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

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 comprueba la entrada del usuario). Este método devuelve verdadero.

URLUtil.isValidUrl(url) funciona correctamente para mí. Tal vez sería útil para otra persona

Cuestiones relacionadas