【问题标题】:Using Context.CONNECTIVITY_SERVICE to check for internet connection使用 Context.CONNECTIVITY_SERVICE 检查互联网连接
【发布时间】:2012-02-18 14:32:06
【问题描述】:

我正在使用此代码检查互联网连接:

private boolean checkInternetConnection() {
    ConnectivityManager cm = (ConnectivityManager)
                              getSystemService(Context.CONNECTIVITY_SERVICE);
    // test for connection
    if (cm.getActiveNetworkInfo() != null
            && cm.getActiveNetworkInfo().isAvailable()
            && cm.getActiveNetworkInfo().isConnected()) {
        return true;
    } else {
        return false;
    }
}

但即使我关闭 wifi,它仍然返回 true。

在模拟器和设备上都试过,结果相同?
怎么了?

【问题讨论】:

  • 我认为它也在检查您的移动运营商网络。
  • 那我该怎么办?你能帮忙吗?

标签: android networking


【解决方案1】:

您可以使用以下内容:

    public boolean isNetworkAvailable(Context contextValue) {
    Context context = contextValue;
    ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    if (connectivity != null) {
        NetworkInfo[] info = connectivity.getAllNetworkInfo();
        if (info != null) {
            for (int i = 0; i < info.length; i++) {
                if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
        }
    }

    return false;

}

【讨论】:

    【解决方案2】:

    这个简单的代码适用于我的情况:

    public boolean netConnect(Context ctx)
    {
        ConnectivityManager cm;
        NetworkInfo info = null;
        try
        {
            cm = (ConnectivityManager) 
                  ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
            info = cm.getActiveNetworkInfo();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        if (info != null)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    

    还有这个..

    public boolean isOnline() {
        ConnectivityManager cm = (ConnectivityManager)
                                  getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        if (netInfo != null && netInfo.isConnectedOrConnecting()) {
            return true;
        }
        return false;
    }
    

    【讨论】:

    • ConnectivityManager 的 getActiveNetworkInfo() 方法返回一个 NetworkInfo 实例,该实例表示它可以找到的第一个连接的网络接口,如果接口已连接,则返回 null 如果没有。检查此方法是否返回 null 应该足以判断 Internet 连接是否可用。
    • 这是否需要任何特殊权限,例如 ACCESS_WIFI_STATE?
    • getActiveNetworkInfo:“此方法在 API 级别 29 中已弃用。” NetworkInfo:“此类在 API 级别 29 中已弃用。调用者应改为使用 ConnectivityManager.NetworkCallback API 来了解连接更改......”。试试我的答案:stackoverflow.com/a/64977886/1741997
    【解决方案3】:

    您可以通过以下方式检查 WIFI 和互联网:

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

    【讨论】:

    • 改用 networkInfo.getType() == ConnectivityManager.TYPE_WIFI。
    • 使用android常量比假设它们忽略操作系统/制造商更好
    【解决方案4】:

    试试这个....

    if((connMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED) ||  (connMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED))                   
    {
       return true;
    }else
    {
       return false;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 2017-03-16
      相关资源
      最近更新 更多