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?


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 .


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


1
tampaknya selama itu memiliki http://atau https://akan kembali benar
hehe

Apakah ini membantu menghindari url seperti mailto: abc@xyz.com dan tentang: kosong # diblokir
RamPrasadBismil

69
URLUtil.isValidUrl(url);

Jika ini tidak berhasil, Anda dapat menggunakan:

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

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

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.


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

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

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


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
}


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.


2

Tambahkan saja baris kode ini:

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

0
new java.net.URL(String) throws MalformedURLException
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.