2012-07-30 77 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