Wykryj, czy na Androidzie jest dostępne połączenie internetowe [duplikat]

Możliwy duplikat:
Jak sprawdzić dostęp do Internetu na Androidzie? InetAddress never timeouts

Muszę wykryć, czy urządzenie z Androidem jest podłączone do Internetu.

Klasa NetworkInfo zapewnia niestatyczną metodę isAvailable(), która brzmi idealnie.

Problem polega na tym, że:

NetworkInfo ni = new NetworkInfo();
if (!ni.isAvailable()) {
    // do something
}

Wyrzuca ten błąd:

The constructor NetworkInfo is not visible.

Bezpieczny zakład polega na tym, że istnieje inna klasa, która zwraca obiekt NetworkInfo. Ale nie wiem które.

  1. Jak uruchomić powyższy fragment kodu?
  2. Jak mogłem znaleźć potrzebne mi informacje w dokumentacji online?
  3. Czy możesz zaproponować lepszy sposób na tego typu wykrywanie?
Author: Community, 2010-11-21

6 answers

Metoda getActiveNetworkInfo() z ConnectivityManager zwraca instancję NetworkInfo reprezentującą pierwszy podłączony interfejs sieciowy, który może znaleźć lub null jeśli żaden z interfejsów nie jest podłączony. Sprawdzenie, czy ta metoda zwraca null powinno wystarczyć, aby stwierdzić, czy połączenie internetowe jest dostępne, czy nie.

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
          = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

Będziesz również potrzebował:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
W manifeście Androida.

Edit:

Zauważ, że posiadanie aktywnego interfejsu sieciowego nie gwarantuje, że dana sieć usługa jest dostępna. Problemy z siecią, przestoje serwera, niski sygnał, portale zamknięte, filtry treści i tym podobne mogą uniemożliwić aplikacji dotarcie do serwera. Na przykład nie możesz być pewien, czy Twoja aplikacja może dotrzeć do Twittera, dopóki nie otrzymasz prawidłowej odpowiedzi z usługi Twitter.

 1265
Author: Alex Jasmin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-24 17:01:43

Sprawdzam zarówno Wi-fi, jak i mobilny internet w następujący sposób...

private boolean haveNetworkConnection() {
    boolean haveConnectedWifi = false;
    boolean haveConnectedMobile = false;

    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] netInfo = cm.getAllNetworkInfo();
    for (NetworkInfo ni : netInfo) {
        if (ni.getTypeName().equalsIgnoreCase("WIFI"))
            if (ni.isConnected())
                haveConnectedWifi = true;
        if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
            if (ni.isConnected())
                haveConnectedMobile = true;
    }
    return haveConnectedWifi || haveConnectedMobile;
}

Oczywiście można go łatwo zmodyfikować, aby sprawdzić poszczególne typy połączeń, np. jeśli aplikacja potrzebuje potencjalnie wyższych prędkości Wi-fi do poprawnego działania itp.

 217
Author: Squonk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-25 16:20:28

Krok 1: Utwórz klasę AppStatus w swoim projekcie(możesz również podać inną nazwę). Następnie wklej podane poniżej linie do kodu:

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;


public class AppStatus {

    private static AppStatus instance = new AppStatus();
    static Context context;
    ConnectivityManager connectivityManager;
    NetworkInfo wifiInfo, mobileInfo;
    boolean connected = false;

    public static AppStatus getInstance(Context ctx) {
        context = ctx.getApplicationContext();
        return instance;
    }

    public boolean isOnline() {
        try {
            connectivityManager = (ConnectivityManager) context
                        .getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        connected = networkInfo != null && networkInfo.isAvailable() &&
                networkInfo.isConnected();
        return connected;


        } catch (Exception e) {
            System.out.println("CheckConnectivity Exception: " + e.getMessage());
            Log.v("connectivity", e.toString());
        }
        return connected;
    }
}

Krok 2: teraz, aby sprawdzić, czy urządzenie ma łączność sieciową, po prostu dodaj ten fragment kodu tam, gdzie chcesz to sprawdzić ...

if (AppStatus.getInstance(this).isOnline()) {

    Toast.makeText(this,"You are online!!!!",8000).show();

} else {

    Toast.makeText(this,"You are not online!!!!",8000).show();
    Log.v("Home", "############################You are not online!!!!");    
}
 64
Author: Vivek Parihar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 13:03:36

Kolejna ważna uwaga. Musisz ustawić android.permission.ACCESS_NETWORK_STATE W AndroidManifest.xml, aby to działało.

_ Jak mogłem znaleźć potrzebne mi informacje w dokumentacji online?

Wystarczy, że odpowiednio przeczytasz dokumentację klas, a znajdziesz wszystkie odpowiedzi, których szukasz. Sprawdź dokumentację na Connectitymanager . Opis mówi ci, co masz robić.

 14
Author: Octavian Damiean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-21 17:07:41

Metoda getActiveNetworkInfo () dla ConnectivityManager zwraca Instancja NetworkInfo reprezentująca pierwszą podłączoną sieć interfejs może znaleźć lub null, jeśli none, jeśli interfejsy są podłączone. Sprawdzenie, czy ta metoda zwraca null powinno wystarczyć, aby stwierdzić, czy dostęp do Internetu jest dostępny.

private boolean isNetworkAvailable() {
     ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
     NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
     return activeNetworkInfo != null; 
}

Będziesz także potrzebował:

W Twoim manifest Androida.

Edit:

Zauważ, że mając aktywny interfejs sieciowy nie gwarantuje, że dostępna jest konkretna Usługa sieciowa. Problemy z siecią, serwerem przestoje, niski sygnał, portale prywatne, filtry treści i tym podobne wszystko to może uniemożliwić aplikacji dotarcie do serwera. Na przykład ty nie można stwierdzić, czy aplikacja może dotrzeć do Twittera, dopóki nie otrzymasz prawidłowa odpowiedź z serwisu Twitter.

GetActiveNetworkInfo() nie powinno nigdy dawać null. Nie wiem, co sobie myśleli, kiedy na to wpadli. Powinno dać ci obiekt zawsze.

 10
Author: axllaruse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-05 06:55:36

Prawdopodobnie odnalazłem siebie:

ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting();
 7
Author: dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-07 14:28:25