1. ホーム
  2. android

[解決済み] Android端末がインターネットに接続されているかどうかを検出する

2022-04-29 09:25:54

質問

自分の端末がインターネットに接続されているかどうかを確認したいのですが、どうすればいいですか?というような回答が多く見受けられました。

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
         = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null;
}

(から引用しています。 Androidでインターネット接続が可能かどうかを検出します。 .)

しかし、これは正しいことではありません。例えば、私が インターネットに接続されていない無線ネットワークに接続されている場合 の場合、このメソッドはtrueを返します... 何かに接続しているだけでなく、インターネットに接続しているかどうかを判断する方法はありますか?

解決方法は?

おっしゃるとおりです。あなたが提供したコードは、ネットワーク接続があるかどうかをチェックするだけです。 インターネット接続が有効かどうかを確認する最良の方法は、接続を試みることです。 をhttp経由で既知のサーバに送信します。

public static boolean hasActiveInternetConnection(Context context) {
    if (isNetworkAvailable(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
            urlc.setRequestProperty("User-Agent", "Test");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500); 
            urlc.connect();
            return (urlc.getResponseCode() == 200);
        } catch (IOException e) {
            Log.e(LOG_TAG, "Error checking internet connection", e);
        }
    } else {
        Log.d(LOG_TAG, "No network available!");
    }
    return false;
}

もちろん http://www.google.com のURLを、接続したい他のサーバーや、稼働率の良いサーバーに置き換えてください。

でTony Choも指摘しているように 以下のコメント そうしないと、NetworkOnMainThread例外が発生します(Android 3.0以降の場合)。代わりにAsyncTaskまたはRunnableを使用してください。

もしgoogle.comを使いたいなら、Jeshurunの改造を見るべきでしょう。で 回答 彼は私のコードを修正し、少し効率的にしました。に接続すると

HttpURLConnection urlc = (HttpURLConnection) 
            (new URL("http://clients3.google.com/generate_204")
            .openConnection());

そして、レスポンスコードが 204 であることを確認します。

return (urlc.getResponseCode() == 204 && urlc.getContentLength() == 0);

であれば、最初にgoogleのホームページ全体を取得する必要はありません。