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

135

有没有好的方法可以避免因主机无法解析而导致应用程序崩溃的错误?是否有一种方法可以尝试连接到主机(如URL),并查看它是否有效?


你是如何连接到主机的? - SteelBytes
12个回答

245

使用 URLUtil 来验证以下URL。

 URLUtil.isValidUrl(url)

如果URL有效,它将返回True,如果URL无效,它将返回false


isValidUrl对于以下URL返回false,尽管设备似乎对其很满意(它缺少file:后面的双斜杠)。"file:/storage/emulated/0/Android/data/com.samsung.android.app.pinboard/files/ClipData/Screenshot_NormarAppImage.png" - Tom Hamshere
8
我不会依赖这种方法,因为它只能验证最简单的WebView情况,而不能进行深度验证。请参见来源 - marwinXXII
22
更好的答案:https://dev59.com/n2035IYBdhLWcg3wHsKR#7754297 - marwinXXII
2
似乎只要包含 http://https://,它就会返回 true。 - hehe
这会有助于避免像mailto: abc@xyz.com和about:blank#blocked这样的URL吗? - RamPrasadBismil

103
URLUtil.isValidUrl(url);

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

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

1
这不仅仅是检查模式,而不是URL是否实际活动吗? - Declan McKenna
1
据我所知,如果我们需要检查URL是否实际上正在ping或者没有响应,我们应该使用HttpURLConnection类手动进行检查。 - Pranav
如果您需要在没有架构的情况下检查url,请使用第二个选项。 如果未添加架构,则URLUtil.isValidUrl将返回false。 - user3783123

31

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

8

如果您使用的是 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
}

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

只需添加这一行代码:

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

4

我试过很多方法,但是发现没有一个完全适用于这个链接

现在我使用以下方法一切都很顺利。

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

将操作包装在try/catch中。有许多方式可以使URL格式正确但无法检索。此外,像查看主机名是否存在这样的测试并不能保证任何事情,因为主机在检查后可能变得不可达。基本上,没有任何预先检查可以保证检索不会失败并抛出异常,因此最好计划处理异常。


我不介意处理异常,但是如何防止应用程序因该异常而崩溃? - kidalex
6
抓住异常?“处理异常”还可能意味着什么其他的吗? - user207421

4
在我的情况下,Patterns.WEB_URL.matcher(url).matches() 在我输入类似于“first.secondword”的String时无法正确工作(我的应用检查用户输入)。这个方法返回true。
对我来说,URLUtil.isValidUrl(url) 正确地工作。也许对其他人有用。

Patterns.WEB_URL.matcher(url).matches() 在我的端上也失败了,我认为这是因为链接中没有 www,只有 https - undefined

3
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://cats”这样的简单文本被视为URL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接