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

92

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

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

Ответы:

193

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

 URLUtil.isValidUrl(url)

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

dd619
источник
isValidUrl возвращает false для следующего URL-адреса, хотя устройство, похоже, его устраивает (отсутствует двойная косая черта после файла :). "file: /storage/emulated/0/Android/data/com.samsung.android.app.pinboard/files/ClipData/Screenshot_NormarAppImage.png"
Том Хэмшер
7
Я бы не стал полагаться на этот метод, потому что он не выполняет глубокую проверку, только самые простые случаи WebView. См. Источник
marwinXXII 08
14
Лучший ответ: stackoverflow.com/questions/5617749/…
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)у меня работает правильно. Может быть было бы полезно еще кому-нибудь

Jackky777
источник
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
}
Джо Джо
источник
3

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

Patterns.WEB_URL.matcher(potentialUrl).matches()
Мухаммад Наим Парача
источник
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();       
Прабху
источник
0
new java.net.URL(String) throws MalformedURLException
крекер
источник