如何检查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; }