5

我有一个代码来确定是否有网络连接:

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

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

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

    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
    }

但这是一个缓慢的检测。我应该学习一种快速检测它的好方法。

提前致谢。

4

3 回答 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;
}
于 2012-07-30T09:23:48.633 回答
1

所有这些方案的问题在于“互联网”并不作为一个实体存在。失败的连接尝试被报告为“无法访问”或“无法连接到 blahblah 的服务器”是有原因的。例子:

1)你没有信号。你连接到互联网了吗?PING 会成功吗?你能连接到你的目标服务器吗?

2) 您有信号,但已超出您的提供商数据限额。你连接到互联网了吗?PING 会成功吗?你能连接到你的目标服务器吗?

3) 您的提供商连接很好,但他们的主干路由器已关闭。你连接到互联网了吗?PING 会成功吗?你能连接到你的目标服务器吗?

4)您的供应商连接很好,他们的主干路由器已启动,但与服务器所在的 X 国的光纤连接已被某个醉酒的船长和他的船锚中断。你连接到互联网了吗?PING 会成功吗?你能连接到你的目标服务器吗?

5) 到目标国家的所有链接都已连接,但 Fred 用他的挖沟 JCB 切断了服务器场的电源线。Fred 的其他工作之一是为备份生成器提供服务:(您连接到互联网了吗?PING 会成功吗?您可以连接到目标服务器吗?

6) 所有硬件都已启动,但服务器代码是 Fred 在他因无能被降级为挖沟机之前编写的,现在又崩溃了。你连接到互联网了吗?PING 会成功吗?你能连接到你的目标服务器吗?

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

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

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

于 2012-07-30T09:35:34.730 回答
1

这个怎么样?

确保您有一个活动的 WiFi 连接,现在 UseWifiManager.getConnectionInfo()返回有关当前 Wi-Fi 连接的动态信息 WifiInfo,您可以获得WifiInfo.getLinkSpeed(),它为您提供当前的链接速度,并根据某个最小值检查它。

于 2012-07-30T09:35:55.933 回答