检测是否无网络连接

5

我有一段代码用于确定是否存在网络连接:

    ConnectivityManager cm = (ConnectivityManager)  getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();

    if (netInfo != null && netInfo.isConnected()) 
    {
        // There is an internet connection
    }

但是,如果有网络连接而没有互联网连接,这就没有用了。我必须ping一个网站并等待响应或超时来确定互联网连接:

    URL sourceUrl;
    try {
        sourceUrl = new URL("http://www.google.com");
        URLConnection Connection = sourceUrl.openConnection();
        Connection.setConnectTimeout(500);
        Connection.connect();
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

        // no Internet
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

        // no Internet
    }

但是这是一种缓慢的检测方法。我需要学习一种好的、快速的检测方法。

提前致谢。


这意味着你也使用WIFI。我是对的吗? - Chintan Raghwani
1
我已经解释了上面的问题。如果我连接到一个网络,而这个网络没有连接到互联网,我如何检查这个状态。这在上面已经写过了。 - Tuna Karakasoglu
3个回答

2

尝试以下方法来检测不同类型的连接:

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

    ConnectivityManager cm = (ConnectivityManager) Your_Activity_Name.this.getSystemService(Context.CONNECTIVITY_SERVICE);
    // or if function is out side of your Activity then you need context of your Activity
    // and code will be as following
    // (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo[] netInfo = cm.getAllNetworkInfo();
    for (NetworkInfo ni : netInfo)
    {
        if (ni.getTypeName().equalsIgnoreCase("WIFI"))
        {
            if (ni.isConnected())
            {
                haveConnectedWifi = true;
                System.out.println("WIFI CONNECTION AVAILABLE");
            } else
            {
                System.out.println("WIFI CONNECTION NOT AVAILABLE");
            }
        }
        if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
        {
            if (ni.isConnected())
            {
                haveConnectedMobile = true;
                System.out.println("MOBILE INTERNET CONNECTION AVAILABLE");
            } else
            {
                System.out.println("MOBILE INTERNET CONNECTION NOT AVAILABLE");
            }
        }
    }
    return haveConnectedWifi || haveConnectedMobile;
}

感谢Chintan的建议。 - Tuna Karakasoglu

1
所有这类方案的问题在于,“互联网”并不存在作为一个实体。之所以无法连接,报告为“不可达”或“无法连接到服务器”。例如:
1)您没有信号。您是否已连接到互联网?PING 是否成功?您能否连接到目标服务器?
2)您有信号,但您的供应商数据配额已超过。您是否已连接到互联网?PING 是否成功?您能否连接到目标服务器?
3)您的供应商连接良好,但其骨干路由器已关闭。您是否已连接到互联网?PING 是否成功?您能否连接到目标服务器?
4)您的供应商连接良好,其骨干路由器正常,但连接到服务器所在的国家 X 的光纤连接已被某个喝醉了的船长和他的船锚中断。您是否已连接到互联网?PING 是否成功?您能否连接到目标服务器?
5)所有指向目标国家的链接都正常,但弗雷德用他的挖掘机挖断了服务器农场的电缆。弗雷德的另一项工作是维护备用发电机:您是否已连接到互联网?PING 是否成功?您能否连接到目标服务器?

6) 所有硬件都已经准备好了,但是服务器代码是由Fred在被降职为无能力的挖掘工之前编写的,现在又崩溃了。你是否连接到互联网?PING是否成功?你能连接到目标服务器吗?

7) Fred休息了一天,但他的替代者,能干的服务器管理员,在路由器中阻止了ICMP ping以防止ping DOS攻击。你是否连接到互联网?PING是否成功?你能连接到目标服务器吗?

因此,确保的唯一方法是尝试连接到目标服务器并查看发生了什么。

您肯定可以更快地检测到一些负面情况 - 如果没有信号,您肯定无法建立连接:) 除此之外,您应该尝试连接。告诉用户正在发生什么,使用超时并提供“取消”按钮。这大概就是你能做的最好的了。


1
这个怎么样?
确保您有一个活动的WiFi连接,现在使用{{link1:WifiManager.getConnectionInfo()}},它返回有关当前Wi-Fi连接的动态信息{{link2:WifiInfo}},您可以获取{{link3:WifiInfo.getLinkSpeed()}},它给出了当前链接速度,并将其与某些最小值进行比较。

1
Sanjay,你对这个问题的解决方案非常合乎逻辑,但它需要一些实验性的阈值;例如,对于没有互联网连接的情况,它会给出11的链接速度,如果有互联网连接,则会给出54。我不确定它是否适用于世界上所有的网络。 - Tuna Karakasoglu
当我尝试使用不同的调制解调器时,我认为这也不是解决方案。 - Tuna Karakasoglu
@CodersParadise 那只是一个实验性的解决方案 :-) 我自己从未尝试过。 - COD3BOY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接