可能的重复: 如何检查Android上的互联网接入?InetAddress从不超时

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

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

问题是:

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

抛出以下错误:

The constructor NetworkInfo is not visible.

可以肯定的是,还有另一个类返回NetworkInfo对象。但我不知道是哪个。

如何让上面的代码片段工作? 我怎么能在网上文档中找到我需要的信息呢? 你能建议一种更好的检测方法吗?


当前回答

ConnectivityManager的getActiveNetworkInfo()方法返回一个NetworkInfo实例,表示它可以找到的第一个连接的网络接口,如果没有一个接口连接,则返回null。检查此方法是否返回null应该足以判断internet连接是否可用。

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

你还需要:

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

在你的android清单中。

编辑:

请注意,具有活动的网络接口并不能保证特定的网络服务可用。网络问题、服务器停机、低信号、受控门户、内容过滤器等都可能阻止你的应用到达服务器。例如,在收到来自Twitter服务的有效响应之前,你不能确定你的应用程序是否可以访问Twitter。

其他回答

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

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

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

你还需要:

在你的 android清单。 编辑: 请注意,有一个活动的网络接口并不能保证 特定的网络服务可用。网络问题,服务器 停机时间、低信号、专属门户、内容过滤器等等 都可以阻止你的应用到达服务器。比如你 你不能确定你的应用是否可以登陆Twitter,直到你收到一个 来自Twitter服务的有效响应。

getActiveNetworkInfo()不应该给null。我不知道他们想到这个的时候是怎么想的。它总是会给你一个对象。

ConnectivityManager的getActiveNetworkInfo()方法返回一个NetworkInfo实例,表示它可以找到的第一个连接的网络接口,如果没有一个接口连接,则返回null。检查此方法是否返回null应该足以判断internet连接是否可用。

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

你还需要:

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

在你的android清单中。

编辑:

请注意,具有活动的网络接口并不能保证特定的网络服务可用。网络问题、服务器停机、低信号、受控门户、内容过滤器等都可能阻止你的应用到达服务器。例如,在收到来自Twitter服务的有效响应之前,你不能确定你的应用程序是否可以访问Twitter。

还有一个重要的注意事项。你必须设置android。permission。ACCESS_NETWORK_STATE在你的AndroidManifest.xml工作。

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

你只需要适当地阅读这些课程的文档,你就会找到所有你想要的答案。查看ConnectivityManager的文档。描述告诉你该怎么做。

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