2012-07-30 72 views
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 
    } 

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

在此先感谢。

+0

这意味着你也使用WIFI。我对吗??? – 2012-07-30 09:15:37

+0

是的,我只使用Wifi。 – 2012-07-30 09:17:52

+0

那么问题是什么? – 2012-07-30 09:19:28

回答

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; 
} 
+0

感谢您的建议。 – 2012-07-30 09:57:15

+0

你想要这个吗? – 2012-07-30 10:07:41

+0

不是。我认为桑杰得到了我想要的。 – 2012-07-30 10:08:36

1

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

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

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

3)您的提供商连接正常,但其骨干路由器已关闭。你是否连接到互联网? PING会成功吗?你能连接到你的目标服务器吗?

4)您的提供商连接正常,它们的骨干路由器已经启动,但与服务器所在的X国的光纤连接已被一些醉酒船长及其船锚中断。你是否连接到互联网? PING会成功吗?你能连接到你的目标服务器吗?

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

6)所有硬件都已启动,但服务器代码已写入由弗雷德在他被降级为无能的挖沟机之前,现在又崩溃了。你是否连接到互联网? PING会成功吗?你能连接到你的目标服务器吗? 7)Fred已经休假了一天,但是他的替换者,有能力的服务器管理员已经阻止了路由器中的ICMP ping,以防止ping DOS攻击。你是否连接到互联网? PING会成功吗?你能连接到你的目标服务器吗?

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

您可以更快地检测到一些负面情况 - 当然,如果没有信号,您就无法获得连接:)过去,您应该尝试连接。告诉用户发生了什么,使用超时并为用户提供“取消”按钮。这是关于你能做的最好的事情。

+0

马丁感谢您的建议。 – 2012-07-30 10:01:35

1

这个怎么样?

确保你有一个活跃的WiFi连接,现在使用WifiManager.getConnectionInfo()返回有关当前的WiFi连接,WifiInfo动态信息,你可以得到WifiInfo.getLinkSpeed(),它给你当前链路速度和检查,对一些最小值。

+1

和桑杰。你对这个问题的解决方案非常合乎逻辑,但它需要一点实验性的阈值;例如对于没有互联网连接,它给出链接速度11,如果有互联网连接,它给出54.我不知道它是否适用于全球所有网络。 – 2012-07-30 10:07:22

+0

当我用不同的调制解调器尝试时,我认为它不是解决方案。 – 2012-07-30 10:45:07

+0

@CodersParadise这是一个实验性的解决方案:-)我从来没有尝试过自己。 – COD3BOY 2012-07-30 14:28:03