检测Android上是否有可用的Internet连接

时间:2010-11-21 16:35:05

标签: android internet-connection android-internet

我需要检测Android设备是否已连接到互联网。

NetworkInfo类提供听起来很完美的非静态方法isAvailable()

问题是:

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

抛出此错误:

The constructor NetworkInfo is not visible.

安全的赌注是有另一个类返回NetworkInfo个对象。但我不知道哪个。

  1. 如何让上面的代码段工作?
  2. 我怎么能在在线文档中找到自己需要的信息?
  3. 您能为这种类型的检测提出更好的方法吗?

6 个答案:

答案 0 :(得分:1344)

getActiveNetworkInfo() ConnectivityManager方法返回表示它可以找到的第一个连接网络接口的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。

答案 1 :(得分:230)

我检查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速度才能正常工作等。

答案 2 :(得分:71)

步骤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!!!!");    
}

答案 3 :(得分:14)

另一个重要的注意事项。您必须在AndroidManifest.xml中设置android.permission.ACCESS_NETWORK_STATE才能生效。

  

_我怎么能找到自己在在线文档中需要的信息?

您只需要正确阅读课程文档,您就可以找到所需的所有答案。查看ConnectivityManager上的文档。说明会告诉您该怎么做。

答案 4 :(得分:10)

  

ConnectivityManager的getActiveNetworkInfo()方法返回一个   表示第一个连接网络的NetworkInfo实例   它可以找到的接口,如果接口没有连接,则为null。   检查此方法是否返回null应该足以告诉是否   提供互联网连接。

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

您还需要:

  

在你的   android清单。

     

编辑:

     

请注意,拥有有效的网络接口并不能保证a   特定的网络服务可用。网络问题,服务器   停机时间,低信号,强制门户,内容过滤器等   都可以阻止您的应用到达服务器。比如你   无法确定您的应用是否可以在收到之前到达Twitter   来自Twitter服务的有效回复。

getActiveNetworkInfo()不应该永远不会给出null。当他们提出这个问题时,我不知道他们在想什么。它应该总是给你一个对象。

答案 5 :(得分:8)

可能我找到了自己:

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