URL'nin Android'de geçerli olup olmadığı nasıl kontrol edilir


92

Bir uygulamayı çökerten "ana bilgisayar çözülmedi" hatasını önlemenin iyi bir yolu var mı? Bir ana bilgisayara (URL gibi) bağlanmanın ve hatta geçerli olup olmadığını görmenin bir yolu?


ev sahibine nasıl bağlanıyorsun?
SteelBytes

Yanıtlar:


193

URL'yi aşağıdaki gibi doğrulamak için URLUtil kullanın .

 URLUtil.isValidUrl(url)

Bu dönecektir URL geçerli ise TRUE ve URL geçersizse yanlış .


isValidUrl, aşağıdaki URL için yanlış döndürür, ancak cihaz bundan yeterince memnun görünse de (dosyadan sonra çift eğik çizgi eksik :). "file: /storage/emulated/0/Android/data/com.samsung.android.app.pinboard/files/ClipData/Screenshot_NormarAppImage.png"
Tom Hamshere

7
Bu yönteme güvenmem, çünkü derin doğrulama gerçekleştirmiyor, yalnızca en basit WebView durumları. Bkz kaynağı
marwinXXII


1
o olduğu sürece görünüyor http://ya https://doğru dönecektir
hehe

Bu, mailto: abc@xyz.com gibi url'leri önlemeye yardımcı olur mu ve hakkında: boş # engellendi
RamPrasadBismil

69
URLUtil.isValidUrl(url);

Bu işe yaramazsa şunları kullanabilirsiniz:

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

Bu, URL’nin gerçekten etkin olup olmadığını kontrol etmekle kalmıyor mu?
Declan McKenna

1
Bildiğim kadarıyla, url'nin gerçekten ping yapıp yapmadığını kontrol etmemiz gerekiyorsa, bunu HttpURLConnection sınıfını kullanarak manuel olarak kontrol etmeliyiz.
Pranav

Şema olmadan url'leri kontrol etmeniz gerekirse ikinci seçeneği kullanın. URLUtil.isValidUrl, şema eklenmezse yanlış döndürür.
user3783123

URL nasıl kontrol edilir https:////testtovation.com
Manikandan K

18

Burada ve diğer Stackoverflow iş parçacıklarında belirtilen yöntemlerin bir kombinasyonunu kullanırdım:

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

İşlemi bir dene / yakala ile sar. Bir URL'nin iyi biçimlendirilmesinin ancak geri alınamamasının birçok yolu vardır. Ek olarak, ana bilgisayar adının var olup olmadığını görmek gibi testler hiçbir şey garanti etmez çünkü ana makineye kontrolden hemen sonra erişilemez hale gelebilir. Temel olarak, hiçbir ön kontrol, geri alma işleminin başarısız olmayacağını ve bir istisna oluşturmayacağını garanti edemez, bu nedenle istisnaları halletmeyi daha iyi planlamanız gerekir.


İstisnayı ele almak benim için sorun değil ama bu istisna nedeniyle uygulamanın çökmesini nasıl önleyebilirim?
kidalex

4
@kidalex Err, istisnayı yakaladınız mı? "İstisnayı ele almak" başka ne anlama gelebilir?
Marquis of Lorne

4

Birçok yöntem denedim ve bu URL ile kimsenin iyi çalışmadığını görüyorum :

Şimdi aşağıdakileri kullanıyorum ve her şey yolunda gidiyor.

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

"First.secondword" şeklinde yazdığım durumda benim durumum Patterns.WEB_URL.matcher(url).matches()düzgün çalışmıyor String(Uygulamam kullanıcı girişini kontrol ediyor). Bu yöntem true döndürür.

URLUtil.isValidUrl(url)benim için doğru çalışıyor. Belki başkası için yararlı olur


4

Adresinden kullanıyorsanız kotlinaşağıdaki String.ktkodu oluşturabilir ve yazabilirsiniz:

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

Sonra:

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

Bu, kullandığım doğru çözüm. https://Orijinal metnin önüne eklemek, "www.cats.com" gibi metinlerin kabul edilmesini engeller URL. new URL()Başarılı olursa , dikkate alınması gereken " https: // kediler " gibi basit metinleri hariç tutmak için kalıbı kontrol edin URL.


2

Sadece şu kod satırını ekleyin:

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

0
new java.net.URL(String) throws MalformedURLException
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.