如何检查URL是否在Android中有效

有没有避免“主机未解决”的错误崩溃的应用程序的好方法? 一些尝试连接到主机(如URL)的方式,看看它甚至是有效的?

使用URLUtil来validationURL如下。

URLUtil.isValidUrl(url) 

如果URL有效 ,则返回True;如果URL无效 ,则返回false

 URLUtil.isValidUrl(url) 

如果这不起作用,你可以使用:

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

简单的方法

在Patterns类中使用WEB_URL模式

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

如果URL有效 ,则返回True;如果URL无效 ,则返回false

长答案

从Android API级别8开始,有一个WEB_URL模式。 引用来源,它“匹配RFC 3987的大部分”。 如果您的目标级别较低,则可以简单地从源代码复制模式,并将其包含在应用程序中。 我假设你知道如何使用模式和匹配器,所以我不打算在这里更多的细节。

此外,类URLUtil提供了一些有用的方法,例如:

  • isHttpUrl()
  • isValidUrl()

这些方法的描述不是很精细,因此你可能最好从源头上找出哪一个最适合你的目的。

至于何时触发validation检查,有多种可能性:您可以使用EditTextcallback函数

  • onFocusChanged()或
  • onTextChanged()

或使用TextWatcher ,我认为这会更好。

不要使用 URLUtil来validationURL如下。

  URLUtil.isValidUrl(url) 

因为它给像“http://”这样的string作为有效的URL,这是不正确的

在try / catch中包装操作。 有很多方法可以使URL格式良好但不可检​​索。 另外,像查看主机名是否存在的testing不能保证任何东西,因为主机在检查之后可能变得不可用。 基本上,预检不能保证检索不会失败并抛出exception,所以你最好打算处理exception。

我已经尝试了很多methods.And发现没有人正常工作与此url:

现在我使用以下,一切顺利。

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

我会使用这里和其他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; } 
 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; }