Używając compileSdkVersion 23 , próbując jednak obsługiwać już od 9.
getNetworkInfo(int)
został wycofany w 23. Sugerowano użycie getAllNetworks()
igetNetworkInfo(Network)
w zamian. Jednak oba wymagają minimum API 21.
Czy istnieje klasa, której możemy użyć w pakiecie pomocy, która może w tym pomóc?
Wiem, że rozwiązanie zostało zaproponowane wcześniej , jednak wyzwanie, jakim są moje minimalne wymagania API wynoszące 9, stanowi problem.
Odpowiedzi:
Możesz użyć:
Lub w obudowie przełącznika
źródło
activeNetwork.getType()
jest przestarzały iConnectivityManager.TYPE_WIFI
przestarzałycm.getNetworkCapabilities(cm.activeNetwork).hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
Od października 2018 roku zaakceptowana odpowiedź jest przestarzała.
getType()
i same typy są teraz przestarzałe na poziomie 28 interfejsu API. Z Javadoc:Aby użyć
NetworkCapabilities
, musisz przekazaćNetwork
instancję dogetNetworkCapabilities()
metody. Aby uzyskać tę instancję, musisz zadzwonićgetActiveNetwork()
który został dodany na poziomie API 23.Dlatego uważam, że na razie właściwym sposobem bezpiecznego sprawdzenia, czy masz połączenie z Wi-Fi lub siecią komórkową, jest:
Możesz również sprawdzić inne typy
TRANSPORT
, które znajdziesz tutaj .Ważna uwaga: jeśli masz połączenie z Wi-Fi i VPN, Twój obecny stan może być
TRANSPORT_VPN
, więc możesz również to sprawdzić.Nie zapomnij dodać następujących uprawnień do pliku AndroidManifest:
źródło
NetworkInfo
jest amortyzowany, nie możesz już używaćNetWorkInfo
, więc jak to stanowi alternatywę?Aktualizacja z lutego 2020 r .:
Zaakceptowana odpowiedź jest ponownie przestarzała w programie
28 (Android P)
, ale jej metoda zastępowania działa tylko w23 (Android M)
. Aby obsługiwać starsze urządzenia, napisałem funkcję pomocniczą w.Jak używać:
Zwraca wartość
int
, którą możesz zmienićenum
w swoim kodzie:Możesz skopiować wersję Kotlin lub Java funkcji pomocniczej.
Kotlin:
Jawa:
źródło
No Internet
,Cellular
iWi-Fi
. Jeśli nie zależy Ci na typie połączenia, możesz zmodyfikować kod, aby pasował do Twojej aplikacji.Boolean
klasy opakowującej, zamiastboolean
której jest prymitywna. W oświadczeniu if będziesz musiał dodać czek nanull
. A co, jeśli jutro zostanie wprowadzony kolejny nowy tryb transportu w NetworkCapabilities ... więc użycie liczb całkowitych do rozgałęziania pomoże, a także możesz przejść do przypadków przełączania.Zaktualizowana odpowiedź (19:07: 2018):
Ta metoda pomoże Ci sprawdzić, czy połączenie internetowe jest dostępne.
Stara odpowiedź:
Aby uzyskać najlepszą praktykę ponownego wykorzystania kodu, improwizuj odpowiedź Cheese Bread.
Kod można umieścić w klasie Util i można go użyć do sprawdzenia, czy telefon jest podłączony do Internetu przez Wi-Fi lub Internet mobilny z dowolnej części aplikacji.
źródło
activeNetwork.isConnectedOrConnecting()
jest teraz przestarzałyZaakceptowana odpowiedź jest przestarzała w wersji 28, więc oto rozwiązanie, którego używam w moim projekcie.
źródło
Odpowiedź z lutego 2019 r
Aby sprawdzić, czy jesteś online:
Aby uzyskać typ połączenia internetowego przed / po Androidzie M.
Wszystkie przypadki wymagają pozwolenia na dostęp do stanu sieci
Jak
NetworkInfo
jest przestarzałe i od API 29 od teraz musimy używaćConnectivityManager.NetworkCallback
jego zmiany stanu siecionAvailable()
ionLost()
wywołań zwrotnych.Stosowanie:
cechy
LifecycleObserver
aby uniknąć wycieku pamięci, wykonując pewne porządki wonDestroy()
metodzie.BoradcastReceiver
iNetworkInfo
i używaConnectivityManager.NetworkCallback
do API 21 i powyżej.android.permission.ACCESS_NETWORK_STATE
; ale musisz ją dołączyć, jeśli zamierzasz używać klasy użytkowej.Możliwości
źródło
onLost
zostanie wezwany.onLost
nie oznacza, że urządzenie utraciło połączenie z Internetem, ale sieć utraciła połączenie.Dobrze jest sprawdzić, czy Twoja sieć jest połączona z Internetem:
źródło
NetworkCapabilities.NET_CAPABILITY_VALIDATED
.Wersja Kotlin:
źródło
Zgodnie z sugestią Cheese Bread użyj metody getActiveNetworkInfo ()
teraz wywołaj metodę, dla bezpiecznego użycia spróbuj złapać
I nie zapomnij dodać:
źródło
getNetworkInfo(ConnectivityManager.TYPE_ETHERNET).isAvailable
Aby być po bezpiecznej stronie, proponuję zastosować również metodę
Cała metoda może wyglądać następująco:
źródło
activeNetwork.getType()
jest przestarzały iConnectivityManager.TYPE_WIFI
przestarzałyOto jak mogę sprawdzić, czy obecna sieć korzysta z sieci komórkowej w najnowszych wersjach Androida:
źródło
(Prawie) Wszystkie odpowiedzi są przestarzałe w systemie Android P, więc oto
C#
rozwiązanie ( które jest łatwe do naśladowania dla programistów Java )Kluczem jest tutaj
Android.Net.TransportType
źródło
Być może będziemy musieli sprawdzić łączność internetową więcej niż raz. Będzie nam więc łatwiej, jeśli napiszemy blok kodu w metodzie rozszerzającej
Context
. Poniżej znajdują się moje rozszerzenia pomocnicze dlaContext
iFragment
.Sprawdzanie połączenia internetowego
Inne rozszerzenia
źródło
sprawdź, czy Internet jest dostępny
źródło
connectivityManager.getActiveNetwork () nie występuje w poniższym systemie Android M (API 28). networkInfo.getState () jest przestarzała w porównaniu z systemem Android L.
Tak więc ostateczna odpowiedź brzmi:
źródło
Wiele odpowiedzi nadal używa getNetworkType poniżej 23, który jest przestarzały; użyj poniższego kodu, aby sprawdzić, czy urządzenie ma połączenie z Internetem.
..
I nie zapomnij dodać tej linii w Manifest
źródło
Ponieważ opublikowane odpowiedzi pozwalają tylko na zapytanie o aktywną sieć, oto jak uzyskać dostęp
NetworkInfo
do dowolnej sieci, nie tylko aktywnej (na przykład sieć Wi-Fi) (przepraszam, kod Kotlin przed nami)Wymaga to API 21 lub nowszego i pozwolenia
android.permission.ACCESS_NETWORK_STATE
źródło
cm.getNetworkCapabilities(cm.activeNetwork).hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
NetManager , którego możesz użyć do sprawdzenia połączenia internetowego w systemie Android za pomocą Kotlin
Jeśli używasz minSdkVersion> = 23
Jeśli używasz minSdkVersion <23
źródło
https://www.agnosticdev.com/content/how-detect-network-connectivity-android
postępuj zgodnie z tym samouczkiem, który powinien pomóc każdemu, kto szuka odpowiedzi.
uwaga networkInfo jest przestarzałe, dlatego zamień to isNetworkReacheable () na odpowiedź @vidha poniżej, przekazując getApplicationContext () jako parametr
źródło
źródło
U mnie to działa w Kotlinie. Wiele interfejsów API jest przestarzałych w klasie Network Manager, więc poniższa odpowiedź obejmuje całą obsługę API.
Dodasz również poniżej
źródło
Poniższy kod działa na wszystkich interfejsach API. (Kotlin)
Jednak metoda getActiveNetworkInfo () jest przestarzała tylko w API 29 i działa na wszystkich interfejsach API, więc możemy jej używać we wszystkich interfejsach API poniżej 29
źródło
Coś takiego:
A w głównej części programu:
źródło
Działa to również w systemie Android 10. Zwróci wartość true, jeśli zostanie podłączony do Internetu, w przeciwnym razie zwróci wartość false.
źródło