2012-07-30 17 views
5

Mam kod, aby sprawdzić, czy istnieje połączenie sieciowe lub nie:wykryć, jeśli nie ma połączenia internetowego

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

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

Ale jeśli istnieje połączenie sieciowe i brak internetu jest to bezużyteczne. Muszę pingować stronę i czekać na odpowiedź lub czas oczekiwania, aby ustalić połączenie z Internetem:

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 
    } 

Jest to jednak powolne wykrywanie. Powinienem nauczyć się dobrze i szybko to wykryć.

Z góry dziękuję.

+0

Oznacza to, że używasz również WIFI. Czy mam rację??? –

+0

Tak, używam tylko Wi-Fi. –

+0

Więc jaki jest problem? –

Odpowiedz

2

Spróbuj następujący sposób wykryć inny typ połączenia:

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

Dziękuję Chintan za radę. –

+0

Czy tego chciałeś? –

+0

niezupełnie. Myślę, że Sanjay ma to, czego chcę. –

1

Problem z wszystkich tych systemów jest to, że „internet” nie istnieje jako podmiot. Istnieje powód, dla którego nieudane próby połączenia są zgłaszane jako "nieosiągalne" lub "nie mogą połączyć się z serwerem w blahblah". Przykłady:

1) Nie masz sygnału. Czy masz połączenie z internetem? Czy PING powiedzie się? Czy możesz połączyć się z serwerem docelowym?

2) Masz sygnał, ale limit danych operatora został przekroczony. Czy masz połączenie z internetem? Czy PING powiedzie się? Czy możesz połączyć się z serwerem docelowym?

3) Twój dostawca połączenia jest w porządku, ale ich router szkieletowy jest wyłączony. Czy masz połączenie z internetem? Czy PING powiedzie się? Czy możesz połączyć się z serwerem docelowym?

4) Twoje połączenie z dostawcą jest w porządku, ich router szkieletowy jest podniesiony, ale połączenie światłowodowe z krajem X, w którym serwer został przerwany przez pijanego kapitana i kotwicę jego statku. Czy masz połączenie z internetem? Czy PING powiedzie się? Czy możesz połączyć się z serwerem docelowym?

5) Wszystkie linki do kraju docelowego są zakończone, ale Fred, wraz z kopaniem rowów JCB, odciął kabel zasilający do farmy serwerów. Jednym z innych zadań Freda jest obsługa generatora kopii zapasowych :(Czy łączysz się z Internetem? Czy PING powiedzie się? Czy możesz połączyć się z serwerem docelowym?

6) Cały sprzęt działa, ale kod serwera został napisany przez Freda, zanim został zdegradowany do kopacza za niekompetencję i znów się rozbił. Czy masz połączenie z internetem? Czy PING powiedzie się? Czy możesz połączyć się z serwerem docelowym?

7) Fred miał wolny dzień, ale jego zastępczy, kompetentny administrator serwera zablokował ping ICMP w ruterach, aby zapobiec atakom ping DOS. Czy masz połączenie z internetem? Czy PING powiedzie się? Czy możesz połączyć się z serwerem docelowym?

Tak więc, jedynym sposobem, aby się upewnić, jest próba połączenia z serwerem docelowym i zobaczenie, co się stanie.

Z pewnością można wykryć niektóre negatywne przypadki szybciej - na pewno, jeśli nie ma sygnału, nie można uzyskać połączenia :) Po tym, należy po prostu spróbować połączyć. Powiedz użytkownikowi, co się dzieje, użyj limitu czasu i podaj użytkownikowi przycisk "Anuluj". To najlepsze, co możesz zrobić.

+0

Martin dziękuję za radę. –

1

Co powiesz na to?

Sprawdź, czy masz aktywne połączenie WiFi, teraz Użyj WifiManager.getConnectionInfo() która zwraca dynamiczne informacje o bieżącym połączeniu WiFi, WifiInfo, można uzyskać WifiInfo.getLinkSpeed(), co daje aktualną prędkość łącza i sprawdzić, czy przed jakąś wartość minimalną.

+1

I Sanjay. Twoje rozwiązanie tego problemu jest bardzo logiczne, ale wymaga trochę eksperymentalnych wartości progowych; na przykład bez połączenia z Internetem daje prędkość łącza 11, a jeśli jest połączenie internetowe, daje 54. Nie jestem pewien, czy to zadziała dla wszystkich sieci na świecie. –

+0

Kiedy próbowałem z innym modemem, myślę, że nie jest to również solutin. –

+0

@CodersParadise To było eksperymentalne rozwiązanie :-) Nigdy tego nie próbowałem. – COD3BOY

Powiązane problemy