Як перевірити, чи дійсна URL-адреса в Android


92

Чи є хороший спосіб уникнути помилки "хост не вирішено", яка викликає збій програми? Якийсь спосіб спробувати підключитися до хоста (наприклад, URL-адреса) і перевірити, чи він взагалі дійсний?


як ви підключаєтесь до хоста?
SteelBytes

Відповіді:


193

Використовуйте URLUtil для перевірки URL-адреси, як показано нижче.

 URLUtil.isValidUrl(url)

Він поверне значення True, якщо URL-адреса є дійсним, і false, якщо URL-адреса недійсна .


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

7
Я б не покладався на цей метод, оскільки він не виконує глибоку перевірку, лише найбільш прості випадки WebView. Дивіться джерело
marwinXXII

14
Краще відповідь: stackoverflow.com/questions/5617749 / ...
marwinXXII

1
здається, до тих пір, поки воно буде http://або https://воно справдиться
хе-хе

Чи допоможе це уникнути URL-адрес, таких як mailto: abc@xyz.com та about: blank # blocked
RamPrasadBismil

69
URLUtil.isValidUrl(url);

Якщо це не працює, ви можете використовувати:

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

Це не просто перевіряє шаблон, а не те, чи дійсно URL-адреса активна?
Declan McKenna

1
Наскільки мені відомо, якщо нам потрібно перевірити, чи url насправді пінгує чи ні, ми повинні перевірити це вручну за допомогою класу HttpURLConnection.
Пранав

Використовуйте другий варіант, якщо вам потрібно перевірити URL-адреси без схеми. URLUtil.isValidUrl поверне значення false, якщо схема не додана.
user3783123

Як перевірити URL-адресу - https:////testtovation.com
Manikandan K

18

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

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

5

Оберніть операцію у спробі / лові. Є багато способів, як 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" (мій додаток перевіряє введення користувачем). Цей метод повертає true.

URLUtil.isValidUrl(url)для мене працює правильно. Можливо, це було б корисно комусь іншому


4

Якщо ви використовуєте з, 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.