734

重複の可能性:
Androidでインターネットアクセスを確認する方法は?InetAddressがタイムアウトすることはありません

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

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

問題は次のとおりです。

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

このエラーをスローします:

The constructor NetworkInfo is not visible.

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

  1. 上記のコードスニペットを機能させるにはどうすればよいですか?
  2. オンラインドキュメントで必要な情報を自分で見つけるにはどうすればよいですか?
  3. このタイプの検出のためのより良い方法を提案できますか?
4

6 に答える 6

1476

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

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に到達できるかどうかを確認することはできません。

于 2010-11-21T16:53:28.700 に答える
258

私は次のように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が必要かどうかなどです。

于 2010-11-21T18:12:55.383 に答える
78

ステップ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!!!!");    
}
于 2011-08-08T19:30:07.237 に答える
14

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

_オンラインドキュメントで必要な情報を自分で見つけるにはどうすればよいですか?

クラスのドキュメントを適切に読むだけで、探しているすべての答えを見つけることができます。ConnectivityManagerのドキュメントを確認してください。説明はあなたに何をすべきかを教えてくれます。

于 2010-11-21T17:01:37.177 に答える
11

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を与えるべきではありません。彼らがそれを思いついたとき、彼らが何を考えていたのか分かりません。それはあなたに常にオブジェクトを与えるはずです。

于 2011-08-20T14:03:13.577 に答える
9

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

ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting();
于 2010-11-21T16:57:24.210 に答える