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


90

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


您如何连接到主机?
SteelBytes 2011年

Answers:


190

使用 URLUtil 验证URL,如下所示。

 URLUtil.isValidUrl(url)

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


尽管设备对它满意,但isValidUrl对于以下URL返回false,尽管设备似乎对此感到满意(文件后缺少双斜杠:)。“文件:/storage/emulated/0/Android/data/com.samsung.android.app.pinboard/files/ClipData/Screenshot_NormarAppImage.png”
Tom Hamshere

7
我不会依赖此方法,因为它仅对大多数简单的WebView案例不执行深度验证。参见来源
marwinXXII 2014年


1
似乎只要它已经存在http://https://它将返回true

这样有助于避免类似mailto的网址:abc@xyz.com和about:blank#blocked
RamPrasadBismil

67
URLUtil.isValidUrl(url);

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

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

这不仅会检查模式,还会检查URL是否实际处于活动状态?
Declan McKenna

1
据我所知,如果我们需要检查url是否实际上是ping,我们应该使用HttpURLConnection类手动检查它。
普拉纳夫

如果您需要检查不带模式的URL,请使用第二个选项。如果未添加架构,则URLUtil.isValidUrl将返回false。
user3783123

如何检查网址是https:////testtovation.com
Manikandan K

18

我将在这里和其他Stackoverflow线程中使用上述方法的组合:

private boolean isValid(String urlString) {
    try {
        URL url = new URL(urlString);
        return URLUtil.isValidUrl(url) && Patterns.WEB_URL.matcher(url).matches();
    } catch (MalformedURLException e) {

    }

    return false;
}

5

将操作包装在try / catch中。URL可以采用多种格式,但不可检索。另外,诸如查看主机名是否存在之类的测试无法保证任何事情,因为在检查之后主机可能变得不可访问。基本上,没有任何预检查可以保证检索不会失败并引发异常,因此您更好地计划处理异常。


我不介意处理该异常,但是如何防止该异常导致该应用崩溃?
kidalex'2

4
@kidalex Err,抓到异常了吗?什么别的可能“处理异常”可能是什么意思?
罗恩侯爵

4

我尝试了很多方法,发现没有人能很好地使用此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;
}

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

4

就我而言Patterns.WEB_URL.matcher(url).matches(),当我键入String类似于“ first.secondword”(我的应用检查用户输入)时,它无法正常工作。此方法返回true。

URLUtil.isValidUrl(url)为我正常工作。也许对其他人有用


4

如果您使用from kotlin,则可以创建一个String.kt并编写以下代码:

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

然后:

String url = "www.yourUrl.com"
if (!url.isValidUrl()) {
    //some code
}else{
   //some code
}


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

这是我正在使用的正确解决方案。https://在原始文本之前添加可防止将诸如“ www.cats.com”之类的文本视为URL。如果new URL()成功,那么只要检查模式即可排除要考虑的简单文本,例如“ https:// catsURL


2

只需添加以下代码行:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.