kidalex
kidalex

Reputation: 1527

How to check if URL is valid in Android

Is there a good way to avoid the "host is not resolved" error that crashes an app? Some sort of a way to try connecting to a host ( like a URL ) and see if it's even valid?

Upvotes: 141

Views: 140716

Answers (13)

milad fallahi
milad fallahi

Reputation: 29

public static boolean isLink(String url) {
    // Regular expression to match a complete and valid URL
    String urlRegex = "\\b((http|https|ftp):\\/\\/[a-z0-9-]+(\\.[a-z0-9-]+)+([\\/?].*)?)\\b";
    Pattern urlPattern = Pattern.compile(urlRegex, Pattern.CASE_INSENSITIVE);

    if (url == null) {
        return false;
    }
    Matcher matcher = urlPattern.matcher(url);
    return matcher.matches();
}

Upvotes: 0

dd619
dd619

Reputation: 6170

Use URLUtil to validate the URL as below.

URLUtil.isValidUrl(url)

It will return true if URL is valid and false if URL is invalid.

Upvotes: 260

Ayaz Alifov
Ayaz Alifov

Reputation: 8588

I would use a combination of methods mentioned here and in other Stackoverflow threads:

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

Upvotes: 32

Prabhu
Prabhu

Reputation: 376

Just add this line of code:

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

Upvotes: 5

Pranav
Pranav

Reputation: 4250

URLUtil.isValidUrl(url);

If this doesn't work you can use:

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

Upvotes: 106

Chirila Vasile
Chirila Vasile

Reputation: 359

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

This is the correct sollution that I'm using. Adding https:// before original text prevents text like "www.cats.com" to be considered as URL. If new URL() succeed, then if you just check the pattern to exclude simple texts like "https://cats" to be considered URL.

Upvotes: 3

Muhammad Naeem Paracha
Muhammad Naeem Paracha

Reputation: 2595

You cans validate the URL by following:

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

Upvotes: 3

k4dima
k4dima

Reputation: 6251

new java.net.URL(String) throws MalformedURLException

Upvotes: 0

jo jo
jo jo

Reputation: 1838

If you are using from kotlin you can create a String.kt and write code bellow:

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

Then:

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

Upvotes: 9

Jackky777
Jackky777

Reputation: 654

In my case Patterns.WEB_URL.matcher(url).matches() does not work correctly in the case when I type String similar to "first.secondword"(My app checks user input). This method returns true.

URLUtil.isValidUrl(url) works correctly for me. Maybe it would be useful to someone else

Upvotes: 4

Krzysztof Dziuba
Krzysztof Dziuba

Reputation: 591

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

Upvotes: 4

androidyue
androidyue

Reputation: 1112

I have tried a lot of methods.And find that no one works fine with this URL:

Now I use the following and everything goes well.

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

Upvotes: 4

nobody
nobody

Reputation: 20174

Wrap the operation in a try/catch. There are many ways that a URL can be well-formed but not retrievable. In addition, tests like seeing if the hostname exists doesn't guarantee anything because the host might become unreachable just after the check. Basically, no amount of pre-checking can guarantee that the retrieval won't fail and throw an exception, so you better plan to handle the exceptions.

Upvotes: 4

Related Questions