Как проверить, действителен ли URL в Android - PullRequest
67 голосов
/ 05 февраля 2011

Есть ли хороший способ избежать ошибки "хост не решен", которая приводит к сбою приложения? Какой-то способ попробовать подключиться к хосту (например, URL) и посмотреть, является ли он действительным?

Ответы [ 11 ]

153 голосов
/ 18 декабря 2012

Используйте URLUtil для проверки URL, как показано ниже.

 URLUtil.isValidUrl(url)

Будет возвращено True, если URL действителен и false, если URL недействителен.

49 голосов
/ 27 января 2014
URLUtil.isValidUrl(url) 

Если это не работает, вы можете использовать:

Patterns.WEB_URL.matcher(url).matches()
5 голосов
/ 06 декабря 2016

Я бы использовал комбинацию методов, упомянутых здесь и в других потоках Stackoverflow:

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

    }

    return false;
}
5 голосов
/ 05 февраля 2011

Завершение операции в try / catch.Есть много способов, которыми URL может быть правильно сформирован, но не может быть извлечен.Кроме того, такие тесты, как определение наличия имени хоста, ничего не гарантируют, поскольку хост может стать недоступным сразу после проверки.По сути, никакая предварительная проверка не может гарантировать, что поиск не завершится с ошибкой и не выдаст исключение, поэтому вам лучше планировать обработку исключений.

4 голосов
/ 26 декабря 2018

Вы можете проверить URL следующим образом:

Patterns.WEB_URL.matcher(potentialUrl).matches()
4 голосов
/ 30 апреля 2014

Я перепробовал много методов. И обнаружил, что никто не работает нормально с этим 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;
}
3 голосов
/ 28 ноября 2017

В моем случае Patterns.WEB_URL.matcher(url).matches() не работает правильно в случае, когда я набираю String аналогично «first.secondword» (Мое приложение проверяет ввод пользователя).Этот метод возвращает true.

URLUtil.isValidUrl(url) у меня работает правильно.Может быть, это будет полезно для кого-то еще

3 голосов
/ 27 октября 2017
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;
            }
2 голосов
/ 10 сентября 2018

Если вы используете от 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
}
0 голосов
/ 05 июля 2019
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.

...