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


92

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


как вы подключаетесь к хосту?
SteelBytes 05

Ответы:


193

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

 URLUtil.isValidUrl(url)

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


isValidUrl возвращает false для следующего URL-адреса, хотя устройство, похоже, его устраивает (отсутствует двойная косая черта после файла :). "file: /storage/emulated/0/Android/data/com.samsung.android.app.pinboard/files/ClipData/Screenshot_NormarAppImage.png"
Том Хэмшер

7
Я бы не стал полагаться на этот метод, потому что он не выполняет глубокую проверку, только самые простые случаи WebView. См. Источник
marwinXXII 08


1
кажется, что до тех пор, пока это будет http://или https://оно вернется, правда
хе-хе

Поможет ли это избежать URL-адресов, таких как mailto: abc@xyz.com и about: blank # blocked
RamPrasadBismil

69
URLUtil.isValidUrl(url);

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

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

Разве это не просто проверка шаблона, а не то, действительно ли URL-адрес активен?
Деклан МакКенна

1
Насколько я знаю, если нам нужно проверить, действительно ли URL-адрес пингуется или нет, мы должны вручную проверить это с помощью класса HttpURLConnection.
Пранав

Используйте второй вариант, если вам нужно проверить URL-адреса без схемы. URLUtil.isValidUrl вернет false, если схема не добавлена.
user3783123

Как проверить URL-адрес https:////testtovation.com
Manikandan K

18

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

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

    }

    return false;
}

5

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


Я не против обработки исключения, но как мне предотвратить сбой приложения из-за этого исключения?
kidalex

4
@kidalex Эээ, поймать исключение? Что еще может означать «обработка исключения»?
Маркиз Лорн,

4

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

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

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

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


4

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


2
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.


2

Просто добавьте эту строку кода:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.