Bagaimana cara memeriksa apakah URL valid di Android

92

Adakah cara yang baik untuk menghindari kesalahan "host tidak terselesaikan" yang membuat aplikasi mogok? Semacam cara untuk mencoba menghubungkan ke host (seperti URL) dan melihat apakah itu valid?

kidalex.dll
sumber
bagaimana Anda terhubung ke host?
SteelBytes

Jawaban:

193

Gunakan URLUtil untuk memvalidasi URL seperti di bawah ini.

 URLUtil.isValidUrl(url)

Ini akan mengembalikan True jika URL valid dan false jika URL tidak valid .

dd619
sumber
isValidUrl mengembalikan false untuk URL berikut, meskipun perangkat tampaknya cukup puas (tidak ada garis miring setelah file :). "file: /storage/emulated/0/Android/data/com.samsung.android.app.pinboard/files/ClipData/Screenshot_NormarAppImage.png"
Tom Hamshere
7
Saya tidak akan mengandalkan metode ini, karena tidak melakukan validasi mendalam, hanya sebagian besar kasus WebView sederhana. Lihat sumber
marwinXXII
14
Jawaban yang lebih baik: stackoverflow.com/questions/5617749/…
marwinXXII
1
tampaknya selama itu memiliki http://atau https://akan kembali benar
hehe
Apakah ini membantu menghindari url seperti mailto: [email protected] dan tentang: kosong # diblokir
RamPrasadBismil
69
URLUtil.isValidUrl(url);

Jika ini tidak berhasil, Anda dapat menggunakan:

Patterns.WEB_URL.matcher(url).matches();
Pranav
sumber
Apakah ini tidak hanya memeriksa pola daripada apakah URL benar-benar aktif?
Declan McKenna
1
Sejauh yang saya tahu, jika kita perlu memeriksa apakah url benar-benar ping atau tidak, kita harus memeriksanya secara manual menggunakan kelas HttpURLConnection.
Pranav
Gunakan opsi kedua jika Anda perlu memeriksa url tanpa skema. URLUtil.isValidUrl akan mengembalikan false jika skema tidak ditambahkan.
pengguna3783123
Cara mengecek url adalah https:////testtovation.com
Manikandan K
18

Saya akan menggunakan kombinasi metode yang disebutkan di sini dan di utas Stackoverflow lainnya:

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;
}
Ayaz Alifov
sumber
5

Selesaikan operasi dengan mencoba / menangkap. Ada banyak cara agar URL dapat dibentuk dengan baik tetapi tidak dapat diambil kembali. Selain itu, pengujian seperti melihat apakah nama host ada tidak menjamin apa pun karena host mungkin menjadi tidak dapat dijangkau setelah pemeriksaan. Pada dasarnya, tidak ada pengecekan awal yang dapat menjamin bahwa pengambilan tidak akan gagal dan mengeluarkan pengecualian, jadi Anda lebih baik berencana untuk menangani pengecualian.

tak seorangpun
sumber
Saya tidak keberatan menangani pengecualian tetapi bagaimana cara mencegah aplikasi mogok karena pengecualian itu?
kidalex
4
@ Kidalex Err, tangkap pengecualian? Apa lagi artinya 'menangani pengecualian'?
Marquis dari Lorne
4

Saya telah mencoba banyak metode. Dan ternyata tidak ada yang berfungsi dengan baik dengan URL ini:

Sekarang saya menggunakan yang berikut dan semuanya berjalan dengan baik.

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;
}
androidyue
sumber
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;
            }
Krzysztof Dziuba
sumber
4

Dalam kasus saya Patterns.WEB_URL.matcher(url).matches()tidak berfungsi dengan benar dalam kasus ketika saya mengetikString mirip dengan "first.secondword" (aplikasi saya memeriksa input pengguna). Metode ini mengembalikan nilai true.

URLUtil.isValidUrl(url)bekerja dengan benar untuk saya. Mungkin akan berguna bagi orang lain

Jackky777
sumber
4

Jika Anda menggunakan from kotlinAnda dapat membuat String.ktdan menulis kode di bawah ini:

fun String.isValidUrl(): Boolean = Patterns.WEB_URL.matcher(this).matches()

Kemudian:

String url = "www.yourUrl.com"
if (!url.isValidUrl()) {
    //some code
}else{
   //some code
}
jo jo
sumber
3

Anda dapat memvalidasi URL dengan mengikuti:

Patterns.WEB_URL.matcher(potentialUrl).matches()
Muhammad Naeem Paracha
sumber
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;
    }
}

Ini solusi yang benar yang saya gunakan. Menambahkan https://sebelum teks asli mencegah teks seperti "www.cats.com" dianggap sebagai URL. Jika new URL()berhasil, maka jika Anda hanya memeriksa pola untuk mengecualikan teks sederhana seperti " https: // kucing " untuk dipertimbangkan URL.

Chirila Vasile
sumber
2

Tambahkan saja baris kode ini:

Boolean isValid = URLUtil.isValidUrl(url) && Patterns.WEB_URL.matcher(url).matches();       
Prabhu
sumber
0
new java.net.URL(String) throws MalformedURLException
kreker
sumber