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

如何在Android中检查URL是否有效,android,url,url-validation,Android,Url,Url Validation,有没有一种好方法可以避免导致应用程序崩溃的“主机未解决”错误?某种尝试连接到主机(如URL)并查看其是否有效的方法?将操作包装在try/catch中。有很多方法可以使URL格式良好但不可检索。此外,检查主机名是否存在之类的测试也不能保证任何事情,因为在检查之后主机可能变得不可访问。基本上,任何预检查都不能保证检索不会失败并引发异常,因此您最好计划处理异常。使用URLUtil验证URL,如下所示 URLUtil.isValidUrl(url) 如果URL有效,则返回True;如果URL无效,则

有没有一种好方法可以避免导致应用程序崩溃的“主机未解决”错误?某种尝试连接到主机(如URL)并查看其是否有效的方法?

将操作包装在try/catch中。有很多方法可以使URL格式良好但不可检索。此外,检查主机名是否存在之类的测试也不能保证任何事情,因为在检查之后主机可能变得不可访问。基本上,任何预检查都不能保证检索不会失败并引发异常,因此您最好计划处理异常。

使用URLUtil验证URL,如下所示

 URLUtil.isValidUrl(url)
如果URL有效,则返回True;如果URL无效,则返回false

URLUtil.isValidUrl(url);
如果这不起作用,您可以使用:

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

我尝试了很多方法,发现没有人能很好地与我合作

现在我使用下面的方法,一切都很顺利

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线程中提到的方法:

public static boolean IsValidUrl(String urlString) {
    try {
        URL url = new URL(urlString);
        return URLUtil.isValidUrl(urlString) && Patterns.WEB_URL.matcher(urlString).matches();
    } catch (MalformedURLException ignored) {
    }
    return false;
}

在我的例子中,
Patterns.WEB\u URL.matcher(URL).matches()
在我键入类似于“first.secondword”(我的应用程序检查用户输入)的
字符串时无法正常工作。此方法返回true


URLUtil.isvalidull(url)
对我来说工作正常。如果您使用from
kotlin
可以创建一个
String.kt
并在下面编写代码,那么它可能对其他人有用:

fun String.isValidUrl(): Boolean = Patterns.WEB_URL.matcher(this).matches()
然后:


您可以通过以下方式验证URL:

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

这是我使用的正确解决方案。在原始文本之前添加
https://
,可防止像“www.cats.com”这样的文本被视为
URL
。如果
newurl()
成功,那么如果您只是检查模式以排除要考虑
URL

的简单文本,只需添加以下代码行:

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

你如何连接到主机?我不介意处理异常,但如何防止应用程序因异常而崩溃?@kidalex Err,捕获异常?“处理异常”可能还意味着什么?isvalidul对以下URL返回false,尽管设备似乎对此很满意(它缺少文件后面的双斜杠:)。“文件:/storage/emulated/0/Android/data/com.samsung.Android.app.pinboard/files/ClipData/Screenshot\u NormarAppImage.png”我不会依赖这种方法,因为它不执行深度验证,只执行最简单的WebView案例。查看更好的答案:似乎只要它有
http://
https://
它就会返回true,这有助于避免像mailto这样的URL:abc@xyz.com关于:blank#blocked这不仅仅是检查模式,而是检查URL是否实际处于活动状态?据我所知,如果我们需要检查url是否真的在ping,我们应该使用HttpURLConnection类手动检查是否在ping。如果需要检查没有架构的url,请使用第二个选项。如果未添加架构,URLUtil.isValidUrl将返回false。
new java.net.URL(String) throws MalformedURLException
Patterns.WEB_URL.matcher(potentialUrl).matches()
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;
    }
}
Boolean isValid = URLUtil.isValidUrl(url) && Patterns.WEB_URL.matcher(url).matches();