2012-04-04 36 views
12

W mojej aplikacji, która przetestować na emulatorze, używam następujący kod, aby sprawdzić połączenie sieciowe (WIFI):Sprawdź połączenie sieciowe android

public boolean isOnline() { 
    ConnectivityManager cm = 
     (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
    if (netInfo != null && netInfo.isConnectedOrConnecting()) { 
     return true; 
    } 
    return false; 
} 

Metoda ta zwraca zawsze true, nawet jeśli wyłączyć bezprzewodową połączenie mojego komputera ... Czy jest to spowodowane przez emulator, czy jest to coś innego?

Jeśli to nie jest właściwy sposób sprawdzenia połączenia sieciowego, jak mogę to zrobić?

+0

sprawdź ten kod po ustawieniu emulatora w trybie samolotowym – vipin

+0

czy próbowałeś 'isAvailable()' lub 'isConnected()'? – olix20

+0

@vipin, W locie zwraca wartość false w obu sytuacjach ... – amp

Odpowiedz

35

Lepiej (1) przechodzi w kontekście tak, że każde działanie może wywołać tej funkcji, oraz (2) Ustaw tę funkcję statycznego:

public boolean isNetworkOnline() { 
    boolean status=false; 
    try{ 
     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo netInfo = cm.getNetworkInfo(0); 
     if (netInfo != null && netInfo.getState()==NetworkInfo.State.CONNECTED) { 
      status= true; 
     }else { 
      netInfo = cm.getNetworkInfo(1); 
      if(netInfo!=null && netInfo.getState()==NetworkInfo.State.CONNECTED) 
       status= true; 
     } 
    }catch(Exception e){ 
     e.printStackTrace(); 
     return false; 
    } 
    return status; 

    } 
+0

to zwraca true jak wcześniej ... – amp

+0

kod jest poprawny będzie działać dobrze na każdym urządzeniu – Nishant

+0

Ale muszę przetestować na emulatorze ... Niektóre alternatywy ? – amp

6

Aby uzyskać getActiveNetworkInfo(), aby pracować trzeba dodaj następujące elementy do manifestu.

1. uses-permission android:name="android.permission.INTERNET" 
2. uses-permission 
    android:name="android.permission.ACCESS_NETWORK_STATE" 

lepiej użyć netInfo.isConnected() zamiast netInfo.isConnectedOrConnecting

a także spróbować tej

Context.getSystemService(Context.CONNECTIVITY_SERVICE).getNetworkInfo(ConnectivityManager.TYPE_MOBILE) 

lub

Context.getSystemService(Context.CONNECTIVITY_SERVICE).requestRouteToHost(TYPE_WIFI, int hostAddress) 
0

w moim przypadku, ja wyłączony Wifi, ale zapomniałem o wyłączeniu łączności sieciowej Data/Mobile. Kiedy raz to zrobiłem, kod w oryginalnym poście dla tego wątku działał dla mnie.

Podsumowując:

  1. Przejdź do Ustawienia
  2. Wyłącz WiFi
  3. Go do Ustawienia-> Wykorzystanie danych
  4. Wyłącz komórkową transmisję danych

Settings

Settings->Data Usage

-1

ten sposób umieścić go razem w projekcie:

pliku manifestu:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

Static Function:

public static boolean isNwConnected(Context context) { 
    if (context == null) { 
     return true; 
    } 
    ConnectivityManager connectivityManager = 
     (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo nwInfo = connectivityManager.getActiveNetworkInfo(); 
    if (nwInfo != null && nwInfo.isConnectedOrConnecting()) { 
     return true; 
    } 
    return false; 
} 
0

Możemy sprawdzić połączenia internetowego połączony państwowej przy użyciu poniżej funkcji. Google Android zaktualizował funkcję Androida API, aby sprawdzić stan sieci. Teraz w najnowszych interfejsach API systemu Android getAllNetworkInfo() jest przestarzałe. ale funkcja getAllNetworks() jest dozwolona tylko dla Build.VERSION.SDK_INT> = 21. Mam napisany kod dla wszystkich przypadków.

Aby sprawdzić połączenie internetowe, możesz zadzwonić do tej funkcji.

public static boolean checkInternetConnection(Context context) { 
     ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (connectivity == null) { 
     return false; 
    } else if(Build.VERSION.SDK_INT >= 21){ 
     Network[] info = connectivity.getAllNetworks(); 
     if (info != null) { 
      for (int i = 0; i < info.length; i++) { 
       if (info[i] != null && connectivity.getNetworkInfo(info[i]).isConnected()) { 
        return true; 
       } 
      } 
     } 
    } else { 
     NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
     if (info != null) { 
      for (int i = 0; i < info.length; i++) { 
       if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
        return true; 
       } 
      } 
     } 
     final NetworkInfo activeNetwork = connectivity.getActiveNetworkInfo(); 
     if (activeNetwork != null && activeNetwork.isConnected()) { 
      return true; 
     } 
    } 

    return false; 
} 
Powiązane problemy