Подтвердить что ты не робот

Как проверить правильность URL-адреса в Android

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

4b9b3361

Ответ 1

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

 URLUtil.isValidUrl(url)

Он вернет True, если URL-адрес действителен и false, если URL-адрес недействителен.

Ответ 2

URLUtil.isValidUrl(url);

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

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

Ответ 3

простой способ

Использовать шаблон WEB_URL в классе шаблонов

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

Он вернет True, если URL-адрес действителен и false, если URL-адрес недействителен.

Длинный ответ

Начиная с уровня API Android 8, существует WEB_URL. Цитируя исходный код, он "соответствует большинству RFC 3987". Если вы нацелились на более низкий уровень API, вы можете просто скопировать шаблон из источника и включить его в свое приложение. Я предполагаю, что вы знаете, как использовать шаблоны и шаблоны, поэтому я не буду вдаваться в подробности здесь.

Также класс URLUtil содержит некоторые полезные методы, например:

Описание методов не очень сложное, поэтому вы, вероятно, лучше всего смотрите на источник и выясняете, какой из них лучше подходит для вашей цели.

Что касается того, когда запускать проверку проверки, существует несколько возможностей: вы можете использовать функции обратного вызова EditText

или используйте TextWatcher, который, я думаю, будет лучше.

НЕ ИСПОЛЬЗУЙТЕ URLUtil, чтобы проверить URL-адрес, как показано ниже.

 URLUtil.isValidUrl(url)

потому что он дает строки типа "http://" как действительный URL, который не является истинным

Ответ 4

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

Ответ 5

Я бы использовал комбинацию методов, упомянутых здесь и в других потоках 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;
}

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

Если вы используете из 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
}

Ответ 11

new java.net.URL(String) throws MalformedURLException

Ответ 12

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.