web-dev-qa-db-ja.com

Androidでインターネット接続の可用性をプログラムで確認するにはどうすればよいですか?

Android phone/emulatorにインターネット接続があるかどうかをプログラムで確認したいので、インターネット接続があることを確認したら、インターネットに電話をかけます。

つまり、「エミュレーターねえ!インターネットに接続している場合は、このページを開いてください。そうでない場合は、doSomeThingElse();」のようになります。

18
Fahad

私が自分で実装した方法:

/*
 * isOnline - Check if there is a NetworkConnection
 * @return boolean
 */
protected boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnected()) {
        return true;
    } else {
        return false;
    }
}

これはNetworkConnection-Checkであることに注意してください。 NetworkConnectionがある場合、それはInternetConnectionである必要はありません。

26

ネットワークに接続されていても、インターネット接続が保証されるわけではありません。

自宅のWi-Fiに接続している可能性がありますが、インターネットに接続していない可能性があります。または、Wi-Fiに接続できるレストランにいる場合でも、インターネットを使用するにはホットスポットのパスワードが必要です。このような場合、上記のメソッドはtrueを返しますが、デバイスにはインターネットがありません。適切な試行とキャッチに囲まれていないと、アプリがクラッシュする可能性があります。

要するに、ネットワーク接続はインターネット接続を意味するのではなく、単にデバイスのワイヤレスハードウェアが別のホストに接続でき、両方が接続できることを意味します。

以下は、デバイスがWebサイトに接続できるかどうかを確認し、それに応じて回答を返すことができる方法です。

if (networkConnectivity())
{
    try
    {
        HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.anywebsiteyouthinkwillnotbedown.com").openConnection());
        urlc.setRequestProperty("User-Agent", "Test");
        urlc.setRequestProperty("Connection", "close");
        urlc.setConnectTimeout(3000); //choose your own timeframe
        urlc.setReadTimeout(4000); //choose your own timeframe
        urlc.connect();
        networkcode2 = urlc.getResponseCode();
        return (urlc.getResponseCode() == 200);
    } catch (IOException e)
    {
        return (false);  //connectivity exists, but no internet.
    }
} else
{
    return false;  //no connectivity
}
11
tony9099

質問のタイトルは、インターネットアクセスを確認したい、

したがって、最速の方法であり、少なくとも今のところは効率的です。

thnx to levit 彼の答えに基づく https://stackoverflow.com/a/27312494/3818437

インターネットが利用可能かどうかを気にせずに、ネットワークへの接続を確認したいだけの場合は、ここでのほとんどの回答(受け入れられたものを含む)で、isConnectedOrConnecting()を実装するとうまくいきます。インターネットに接続しているかどうかを知りたい場合は(質問のタイトルが示すように)、メインネームサーバーのPingを読んでください。

 public boolean isOnline() {

     Runtime runtime = Runtime.getRuntime();
     try {

         Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
         int     exitValue = ipProcess.waitFor();
         return (exitValue == 0);

     } catch (IOException e)          { e.printStackTrace(); } 
       catch (InterruptedException e) { e.printStackTrace(); }

     return false; }

それでおしまい!はい、その短い、はい、それは高速です、いいえ、バックグラウンドで実行する必要はありません、いいえ、root権限は必要ありません。

考えられる質問

これは本当に十分に速いですか?

はい、とても速いです!

インターネット上で何かをテストする以外に、インターネットが利用可能かどうかを確認する信頼できる方法は本当にありませんか?

私の知る限りではありませんが、私に知らせてください。答えを編集します。

とにかくリクエストしたい自分のページにpingするだけではいけませんか?

承知しました! 「インターネット接続が利用可能」と自分のサーバーが到達可能であることを区別したい場合は、両方をチェックすることもできます

DNSがダウンしている場合はどうなりますか?

Google DNS(8.8.8.8など)は、世界最大のパブリックDNSサービスです。 2013年の時点で、1日あたり1,300億件のリクエストに対応しています。たとえば、アプリが応答しないことは、おそらくその日の話題ではないでしょう。

どの権限が必要ですか?

ただのインターネットアクセス-どんな驚き^^(ところで、ここで提案された方法のいくつかは、この許可なしにインターネットの利用可能性についてリモートの接着剤を持っている可能性がありますか?)

8
mhdjazmati

私は時々インターネットの状態をチェックするためにこれらの2つの方法を使用していますhttpsプロトコルが機能しません試してくださいhttpプロトコル

// Check if network is available
public static boolean isNetworkAvailable() {
    ConnectivityManager cm = (ConnectivityManager)
            AppGlobals.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = cm.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.isConnected();
}

// ping the google server to check if internet is really working or not
public static boolean isInternetWorking() {
    boolean success = false;
    try {
        URL url = new URL("https://google.com");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setConnectTimeout(10000);
        connection.connect();
        success = connection.getResponseCode() == 200;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return success;
}
3
Bilal Shahid

これを試して:

ConnectivityManager connec = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

if(connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED || connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING  ) {
   text.setText("hey your online!!!")     ;               
   //Do something in here when we are connected   
} else if(connec.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED ||  connec.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED   ) {
   text.setText("Look your not online");           
}
2
evilone

私から 古い回答はこちら

これを試してみてください

@Levitが提供するソリューションを適用し、追加のHttpリクエストを呼び出さない関数を作成しました。

エラーを解決しますUnable to Resolve Host

public static boolean isInternetAvailable(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    if (activeNetwork == null) return false;

    switch (activeNetwork.getType()) {
        case ConnectivityManager.TYPE_WIFI:
            if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED ||
                    activeNetwork.getState() == NetworkInfo.State.CONNECTING) &&
                    isInternet())
                return true;
            break;
        case ConnectivityManager.TYPE_MOBILE:
            if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED ||
                    activeNetwork.getState() == NetworkInfo.State.CONNECTING) &&
                    isInternet())
                return true;
            break;
        default:
            return false;
    }
    return false;
}

private static boolean isInternet() {

    Runtime runtime = Runtime.getRuntime();
    try {
        Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
        int exitValue = ipProcess.waitFor();
        Debug.i(exitValue + "");
        return (exitValue == 0);
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }

    return false;
}

今それを次のように呼びます、

if (!isInternetAvailable(getActivity())) {
     //Show message
} else {
     //Perfoem the api request
}
0
Jaymin Panchal

あなたがネットワークに接続しているからといって、あなたがインターネットを持っていることを保証するものではないので、私はtrycatchブロック内でインターネットに電話をかけることにしました。次に、UnknownHostExceptionをキャッチして、インターネットを処理しません。

0
FoamyGuy