web-dev-qa-db-ja.com

Androidでインターネット接続が利用可能かどうかを検出します

Androidデバイスがインターネットに接続されているかどうかを検出する必要があります。

NetworkInfoクラスは完璧に聞こえる非静的メソッドisAvailable()を提供します。

問題はそれです:

NetworkInfo ni = new NetworkInfo();
if (!ni.isAvailable()) {
    // do something
}

このエラーを投げます:

The constructor NetworkInfo is not visible.

安全な賭けはNetworkInfoオブジェクトを返す別のクラスがあることです。しかし、私はどちらがわかりません。

  1. 上記のコードの断片を機能させるにはどうすればいいですか?
  2. オンライン文書で必要な情報をどのようにして自分で見つけたのでしょうか。
  3. この種の検出にもっと良い方法を提案できますか。
632
dan

ConnectivityManagergetActiveNetworkInfo()メソッドは、最初に見つけた接続先ネットワークインタフェースを表すNetworkInfoインスタンスを返します。接続されているインタフェースがない場合はnullを返します。このメソッドがnullを返すかどうかを確認することは、インターネット接続が利用可能かどうかを判断するのに十分なはずです。

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

また必要になります:

<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />

あなたのAndroidマニフェストで。

編集:

アクティブなネットワークインターフェースを持っていても、特定のネットワークサービスが利用できることを保証するものではありません。ネットワークの問題、サーバーのダウンタイム、低信号、キャプティブポータル、コンテンツフィルターなどがすべて、アプリがサーバーに到達するのを妨げる可能性があります。たとえば、Twitterサービスから有効な応答があるまで、アプリがTwitterにアクセスできるかどうかを確認することはできません。

1339
Alex Jasmin

次のようにWi-Fiとモバイルインターネットの両方を確認します。

private boolean haveNetworkConnection() {
    boolean haveConnectedWifi = false;
    boolean haveConnectedMobile = false;

    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] netInfo = cm.getAllNetworkInfo();
    for (NetworkInfo ni : netInfo) {
        if (ni.getTypeName().equalsIgnoreCase("WIFI"))
            if (ni.isConnected())
                haveConnectedWifi = true;
        if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
            if (ni.isConnected())
                haveConnectedMobile = true;
    }
    return haveConnectedWifi || haveConnectedMobile;
}

明らかに、それは個々の特定の接続タイプをチェックするために容易に修正されるかもしれません、例えばあなたのアプリが正しく動作するためにWi-Fiの潜在的により高いスピードを必要とする場合など。

230
Squonk

ステップ1:プロジェクトにクラスAppStatusを作成します(他の名前も付けることができます)。それからあなたのコードに下記の与えられた行を貼り付けてください:

import Android.content.Context;
import Android.net.ConnectivityManager;
import Android.net.NetworkInfo;
import Android.util.Log;


public class AppStatus {

    private static AppStatus instance = new AppStatus();
    static Context context;
    ConnectivityManager connectivityManager;
    NetworkInfo wifiInfo, mobileInfo;
    boolean connected = false;

    public static AppStatus getInstance(Context ctx) {
        context = ctx.getApplicationContext();
        return instance;
    }

    public boolean isOnline() {
        try {
            connectivityManager = (ConnectivityManager) context
                        .getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        connected = networkInfo != null && networkInfo.isAvailable() &&
                networkInfo.isConnected();
        return connected;


        } catch (Exception e) {
            System.out.println("CheckConnectivity Exception: " + e.getMessage());
            Log.v("connectivity", e.toString());
        }
        return connected;
    }
}

ステップ2:お使いのデバイスにネットワーク接続があるかどうかを確認するには、このコードスニペットを追加してください。

if (AppStatus.getInstance(this).isOnline()) {

    Toast.makeText(this,"You are online!!!!",8000).show();

} else {

    Toast.makeText(this,"You are not online!!!!",8000).show();
    Log.v("Home", "############################You are not online!!!!");    
}
70
Vivek Parihar

また別の重要な注意事項。これを機能させるには、AndroidManifest.xmlにAndroid.permission.ACCESS_NETWORK_STATEを設定する必要があります。

_オンラインドキュメントで必要な情報をどのようにして自分で見つけたのでしょうか。

あなたはただ十分に適切にドキュメンテーションを読む必要がありますそしてあなたが探しているすべての答えを見つけるでしょう。 ConnectivityManager のドキュメントをチェックしてください。説明はあなたに何をすべきかを告げます。

14

ConnectivityManagerのgetActiveNetworkInfo()メソッドは、最初に見つかった接続先ネットワークインタフェースを表すNetworkInfoインスタンスを返します。インタフェースが接続されている場合は、見つからない場合はnullを返します。このメソッドがnullを返すかどうかを確認するだけで、インターネット接続が利用可能かどうかを判断できます。

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

また必要になります:

あなたのAndroidマニフェストで。

編集する

アクティブなネットワークインターフェースを持っていても、特定のネットワークサービスが利用できることを保証するものではありません。ネットワークの問題、サーバーのダウンタイム、低信号、キャプティブポータル、コンテンツフィルターなどがすべて、アプリがサーバーに到達するのを妨げる可能性があります。たとえば、Twitterサービスから有効な応答があるまで、アプリがTwitterにアクセスできるかどうかを確認することはできません。

getActiveNetworkInfo()がnullを与えてはいけません。彼らがそれを思いついたとき彼らが何を考えていたのか私は知りません。それはあなたにいつも物を与えるべきです。

10
axllaruse

おそらく私は自分自身を見つけました:

ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting();
8
dan