Reputation: 1527
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
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
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
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
Reputation: 376
Just add this line of code:
Boolean isValid = URLUtil.isValidUrl(url) && Patterns.WEB_URL.matcher(url).matches();
Upvotes: 5
Reputation: 4250
URLUtil.isValidUrl(url);
If this doesn't work you can use:
Patterns.WEB_URL.matcher(url).matches();
Upvotes: 106
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
Reputation: 2595
You cans validate the URL by following:
Patterns.WEB_URL.matcher(potentialUrl).matches()
Upvotes: 3
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
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
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
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
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