Muszę sprawdzić, czy moje urządzenie ma połączenie z Internetem, czy nie. Znalazłem wiele odpowiedzi, takich jak:
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null;
}
(Zaczerpnięte z opcji Wykryj, czy w systemie Android jest dostępne połączenie internetowe ).
Ale to nie w porządku, na przykład jeśli jestem podłączony do sieci bezprzewodowej, która nie ma dostępu do Internetu , ta metoda zwróci prawdę… Czy istnieje sposób, aby sprawdzić, czy urządzenie ma połączenie z Internetem, a nie, czy jest podłączone tylko do czegoś?
android
internet-connection
android-internet
Buda Gavril
źródło
źródło
isNetworkConnected
Blok zawiera kod przestarzałej dla wszystkichBuild.VERSION.SDK_INT >= Build.VERSION_CODES.M
. Bardziej dogłębną dyskusję na ten temat i jak to naprawić można znaleźć tutaj stackoverflow.com/questions/53532406/…Odpowiedzi:
Masz rację. Podany kod sprawdza tylko, czy istnieje połączenie sieciowe. Najlepszym sposobem sprawdzenia, czy istnieje aktywne połączenie internetowe, jest próba połączenia się ze znanym serwerem za pośrednictwem protokołu http.
Oczywiście możesz zastąpić
http://www.google.com
adres URL dowolnego innego serwera, z którym chcesz się połączyć, lub serwera, o którym wiesz, że ma dobry czas pracy.Jak Tony Cho wskazał również w tym komentarzu poniżej , upewnij się, że nie uruchamiasz tego kodu w głównym wątku, w przeciwnym razie otrzymasz wyjątek NetworkOnMainThread (w systemie Android 3.0 lub nowszym). Zamiast tego użyj AsyncTask lub Runnable.
Jeśli chcesz korzystać z google.com, powinieneś spojrzeć na modyfikację Jeshurun. W swojej odpowiedzi zmodyfikował mój kod i uczynił go nieco bardziej wydajnym. Jeśli łączysz się z
a następnie sprawdź kod odpowiedzi dla 204
wtedy nie musisz najpierw pobierać całej strony głównej Google.
źródło
ConnectivityManager
nie wymaga). W przeciwnym razie na urządzeniach z Androidem 4.x + pojawi sięNetworkOnMainThread
wyjątek.Zmodyfikowałem nieco odpowiedź THelpera, aby użyć znanego hacka, którego używa już Android, do sprawdzenia, czy podłączona sieć Wi-Fi ma dostęp do Internetu. Jest to o wiele bardziej wydajne niż przechwytywanie całej strony głównej Google. Zobacz tutaj i tutaj, aby uzyskać więcej informacji.
źródło
zwraca wartość true, jeśli internet jest rzeczywiście dostępny
Upewnij się, że masz te dwa uprawnienia
jeśli http nie działa, to z powodu nowych zabezpieczeń Androida, nie pozwalają teraz na komunikację zwykłym tekstem. na razie tylko po to, żeby to ominąć.
źródło
Jeśli celujesz w Lollipop lub nowszy, możesz użyć nowej klasy NetworkCapabilities, tj .:
źródło
connectivityManager.getActiveNetwork();
wymaga API lvl23, którym jest Marshmallow, a nie Lollipop.capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
Wydawało się, że Alex załatwił sprawę za mnie!Nie musisz koniecznie tworzyć pełnego połączenia HTTP. Możesz po prostu spróbować otworzyć połączenie TCP ze znanym hostem, a jeśli się powiedzie, masz połączenie z Internetem.
Następnie po prostu sprawdź:
źródło
AsyncTask
Na podstawie zaakceptowanych odpowiedzi zbudowałem tę klasę ze słuchaczem, abyś mógł jej używać w głównym wątku:
Najpierw : klasa InterntCheck, która w tle sprawdza połączenie internetowe, a następnie wywołuje metodę listenera z wynikiem.
Po drugie : utwórz instancję klasy w głównym wątku i poczekaj na odpowiedź (jeśli pracowałeś z interfejsem Firebase dla Androida, zanim będzie Ci to znane!).
Teraz w metodzie onComplete dowiesz się, czy urządzenie jest podłączone do Internetu, czy nie.
źródło
Spróbuj tego
źródło
Możesz to zrobić za pomocą
ConnectivityManager
API dla Androida. Pozwala sprawdzić, czy masz połączenie z Internetem i typ połączenia internetowego, z którym jesteś połączony. Zasadniczo mierzone lub nie mierzone.Aby sprawdzić połączenie internetowe.
Link do dokumentacji: https://developer.android.com/training/monitoring-device-state/connectivity-status-type
źródło
Mam nadzieję, że powyższy kod ci pomoże, upewnij się również, że masz uprawnienia do Internetu w swojej aplikacji.
źródło
Najnowszym sposobem na to z dokumentacji jest użycie
ConnectivityManager
zapytania do aktywnej sieci i określenia, czy ma ona połączenie z Internetem.Dodaj te dwa uprawnienia do pliku AndroidManifest.xml:
źródło
Sprawdź typ wifi w menedżerze łączności:
Dokumentacja systemu Android opisuje „TYPE_WIFI” jako „połączenie danych WIFI. Urządzenia mogą obsługiwać więcej niż jeden ”.
źródło
Fajne rozwiązanie, aby sprawdzić, czy aktywna sieć ma połączenie z Internetem:
źródło
Możesz użyć ConnectivityManager.
Sprawdź to i to
źródło
Użyj następującej klasy , zaktualizowanej do ostatniego poziomu API: 29.
źródło