Muszę wykryć, czy mam łączność sieciową przez WIFI. Jakie rozgłoszenie jest wysyłane w celu ustalenia, czy nawiązano prawidłowe połączenie sieciowe. Muszę sprawdzić, czy istnieje prawidłowe połączenie sieciowe dla protokołu HTTP. Czego powinienem słuchać i jakie dodatkowe testy muszę wykonać, aby wiedzieć, że istnieje prawidłowe połączenie.
android
android-wifi
Androider
źródło
źródło
Odpowiedzi:
Możesz zarejestrować,
BroadcastReceiver
aby otrzymywać powiadomienia o ustanowieniu połączenia Wi-Fi (lub zmianie połączenia).Zarejestruj
BroadcastReceiver
:A potem
BroadcastReceiver
zrób coś takiego:Aby uzyskać więcej informacji, zapoznaj się z dokumentacją dotyczącą
BroadcastReceiver
iWifiManager
Oczywiście należy wcześniej sprawdzić, czy urządzenie jest już podłączone do WiFi.
EDYCJA: Dzięki zakazowi geoinżynierii, oto metoda sprawdzenia, czy urządzenie jest już podłączone:
źródło
private boolean isConnectedViaWifi() { ConnectivityManager connectivityManager = (ConnectivityManager) appObj.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mWifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); return mWifi.isConnected(); }
Najlepsze, które zadziałały dla mnie:
AndroidManifest
Klasa BroadcastReceiver
Uprawnienia
źródło
U mnie
WifiManager.NETWORK_STATE_CHANGED_ACTION
działa tylko .Zarejestruj odbiornik transmisji:
i otrzymaj:
źródło
Odpowiedzi udzielone przez użytkownika @JPM i @usman są naprawdę bardzo przydatne. Działa dobrze, ale w moim przypadku pojawia się
onReceive
wielokrotnie w moim przypadku 4 razy, więc mój kod jest wykonywany wiele razy.Robię trochę modyfikacji i robię zgodnie z moimi wymaganiami, a teraz przychodzi tylko 1 raz
Oto klasa java dla Broadcast.
W AndroidManifest
źródło
Państwo może nawiązać połączenie wifi jeśli dać użytkownikowi możliwość wyboru, aby zastąpić normalne zachowanie prosząc za każdym razem.
Wybieram trzy metody ...
To szybkie sprawdzenie, czy jest połączenie internetowe Wi-Fi lub CellData. Tutaj możesz wybrać, jakie działanie chcesz podjąć. Należy również sprawdzić, czy jest w trybie samolotowym.
W osobnym wątku. Ustawiłem zmienną IpAddress na = "" I sonduj, dopóki nie będę miał prawidłowego adresu IP.
Kolejny fragment kodu ... Jeśli nie jest włączony, włącz go (za wcześniejszą zgodą użytkowników)
źródło
Aby wykryć stan połączenia WIFI, użyłem CONNECTIVITY_ACTION z klasy ConnectivityManager, więc:
i z Twojego BroadCastReceiver:
ps: u mnie działa dobrze :)
źródło
Ten kod w ogóle nie wymaga pozwolenia. Ogranicza się tylko do zmian stanu łączności sieci Wi-Fi (żadna inna sieć nie jest brana pod uwagę). Odbiornik jest statycznie opublikowany w pliku AndroidManifest.xml i nie musi być eksportowane, jak to będzie wywoływana przez system
protected broadcast
,NETWORK_STATE_CHANGED_ACTION
przy każdej zmianie stanu sieci łączności.AndroidManifest:
Klasa BroadcastReceiver:
Uprawnienia:
źródło
Oto przykład mojego kodu, który uwzględnia preferencje użytkowników dotyczące zezwalania na komunikację tylko po podłączeniu do Wi-Fi.
Wywołuję ten kod od wewnątrz
IntentService
przed próbą pobrania rzeczy.Zauważ, że
NetworkInfo
będzie,null
jeśli nie będzie żadnego połączenia sieciowego.źródło
Android O usunął możliwość odbierania niejawnych transmisji dla zmiany stanu Wi-Fi. Jeśli więc Twoja aplikacja jest zamknięta, nie możesz ich otrzymać. Nowa
WorkManager
ma możliwość działania, gdy twoja aplikacja jest zamknięta, więc trochę z nią eksperymentowałem i wydaje się, że działa całkiem dobrze:Dodaj to do swoich zależności:
WifiConnectWorker.kt
MainActivity.kt
Pamiętaj, że to był tylko szybki test jednorazowego powiadomienia. Jest więcej do zrobienia, aby zawsze otrzymywać powiadomienia o włączeniu i wyłączeniu Wi-Fi.
PS: Kiedy aplikacja wymusza zamknięcie , pracownik nie jest uruchamiany, wygląda na to, że
WorkManager
anuluje żądania.źródło
Użyłem tego kodu:
źródło
Mam dwie metody wykrywania połączenia WIFI odbierającego kontekst aplikacji:
1) moja stara metoda
2) moja nowa metoda (obecnie używam tej metody):
źródło
Dla wszystkich, którzy korzystają z transmisji CONNECTIVITY_CHANGE , pamiętaj, że ta funkcja nie jest już uruchamiana, gdy aplikacja działa w tle w systemie Android O.
https://developer.android.com/about/versions/o/background.html
źródło
1) Wypróbowałem podejście Broadcast Receiver, chociaż wiem, że CONNECTIVITY_ACTION / CONNECTIVITY_CHANGE jest przestarzałe w API 28 i nie jest zalecane. Jest również powiązany z użyciem jawnego rejestru, nasłuchuje tak długo, jak działa aplikacja.
2) Wypróbowałem także Firebase Dispatcher, który działa, ale nie poza tym, że aplikacja została zabita.
3) Zalecanym sposobem znalezienia jest WorkManager, aby zagwarantować wykonanie poza procesem zabitym i wewnętrznie za pomocą registerNetworkRequest ()
Największe dowody przemawiające za podejściem nr 3 przedstawia sam dokument dotyczący Androida . Szczególnie w przypadku aplikacji działających w tle.
Również tutaj
Jak dotąd działa to dobrze dla nas, używając okresowego żądania WorkManager.
Aktualizacja: Skończyło się na tym, że napisałem o tym średni post z 2 serii .
źródło