AndroidでURLが有効かどうかを確認する方法


91

アプリをクラッシュさせる「ホストが解決されていません」というエラーを回避する良い方法はありますか?ホスト(URLなど)に接続して、それが有効かどうかを確認するための何らかの方法はありますか?


どのようにホストに接続していますか?
SteelBytes 2011

回答:


191

URLUtil を使用して 、以下のようにURLを検証します。

 URLUtil.isValidUrl(url)

これは、返されたURLが有効である場合はTrueURLが無効の場合はfalse


isValidUrlは、次のURLに対してfalseを返しますが、デバイスはこれに十分満足しているようです(ファイルの後に二重スラッシュがありません:)。"file:/storage/emulated/0/Android/data/com.samsung.android.app.pinboard/files/ClipData/Screenshot_NormarAppImage.png"
Tom Hamshere 2014年

7
このメソッドは詳細な検証を実行せず、最も単純なWebViewの場合のみを実行するため、このメソッドには依存しません。ソースを
marwinXXII 2014年


1
それがそうであるhttp://か、https://それが真に戻る限り、それはそうです
hehe 2017

これは、mailto:abc@xyz.comやabout:blank#blockedのようなURLを回避するのに役立ちますか
RamPrasadBismil

68
URLUtil.isValidUrl(url);

これが機能しない場合は、次を使用できます。

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

これは、URLが実際にアクティブであるかどうかではなく、パターンをチェックするだけではありませんか?
デクランマッケンナ

1
私の知る限り、URLが実際にpingを実行しているかどうかを確認する必要がある場合は、HttpURLConnectionクラスを使用して手動で確認する必要があります。
プラナフ2016年

スキーマなしでURLをチェックする必要がある場合は、2番目のオプションを使用してください。スキーマが追加されていない場合、URLUtil.isValidUrlはfalseを返します。
user37831 2319

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 2011

4
@kidalexエラー、例外をキャッチしますか?「例外の処理」は他に何を意味する可能性がありますか?
ローン侯爵2015

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

fromkotlinを使用している場合は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」のようなテキストはと見なされなくなりますURLnew URL()成功した場合は、パターンをチェックして、「https:// cats」のような単純なテキストを除外して考慮しURLます。


2

次のコード行を追加するだけです。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.