Chcę zaprojektować aplikację, która pokazuje listę dostępnych sieci Wi-Fi i połączyć się z dowolną siecią wybraną przez użytkownika.
Zaimplementowałem część pokazującą wyniki skanowania. Teraz chcę połączyć się z określoną siecią wybraną przez użytkownika z listy wyników skanowania.
Jak mam to zrobic?
android
android-wifi
wifimanager
Vikram Gupta
źródło
źródło
Odpowiedzi:
Musisz utworzyć
WifiConfiguration
taką instancję:Następnie w przypadku sieci WEP musisz to zrobić:
W przypadku sieci WPA musisz dodać hasło w następujący sposób:
W przypadku sieci otwartej musisz to zrobić:
Następnie musisz dodać go do ustawień menedżera Wi-Fi Android:
Na koniec może być konieczne włączenie go, aby system Android się z nim łączył:
UPD: W przypadku WEP, jeśli twoje hasło jest szesnastkowe, nie musisz otaczać go cudzysłowami.
źródło
Wcześniej odpowiedź działa , ale rozwiązanie w rzeczywistości może być prostsze. Zapętlanie listy skonfigurowanych sieci nie jest wymagane, ponieważ identyfikator sieci jest dodawany po dodaniu sieci za pomocą WifiManager.
Kompletne, uproszczone rozwiązanie wyglądałoby mniej więcej tak:
źródło
CHANGE_WIFI_STATE
zezwolenie jest potrzebne.Patrz: https://developer.android.com/reference/android/net/wifi/ScanResult.html#capabilities
Istnieją trzy rodzaje sieci WIFI.
Najpierw utwórz instancję obiektu WifiConfiguration i wypełnij identyfikator SSID sieci (zwróć uwagę, że musi on być zawarty w podwójnych cudzysłowach), ustaw stan początkowy na wyłączony i określ priorytet sieci (liczby około 40 wydają się działać dobrze).
Teraz bardziej skomplikowana część: musimy wypełnić kilku członków konfiguracji Wi-Fi, aby określić tryb bezpieczeństwa sieci. Dla otwartych sieci.
Dla sieci korzystających z WEP; zwróć uwagę, że klucz WEP jest również ujęty w podwójne cudzysłowy.
W przypadku sieci korzystających z WPA i WPA2 możemy ustawić te same wartości dla obu.
Wreszcie możemy dodać sieć do znanej listy WifiManager
źródło
Podziękowania dla @ raji-ramamoorthi & @kenota
Rozwiązaniem, które działało dla mnie, jest połączenie powyższych autorów w tym wątku.
Dotarcie
ScanResult
tutaj jest procesem.Zwróć na
unregister
to uwagęonPause
ionStop
żyj tymunregisterReceiver(broadcastReceiver);
źródło
Jeśli twoje urządzenie zna konfiguracje Wi-Fi (już zapisane), możemy ominąć naukę o rakietach. Wystarczy, że przejdziesz do konfiguracji i sprawdzisz, czy identyfikator SSID jest zgodny. Jeśli tak, połącz się i wróć .
Ustaw uprawnienia:
Połączyć:
źródło
Złamałem głowę, aby zrozumieć, dlaczego twoje odpowiedzi na WPA / WPA2 nie działają ... po wielu godzinach prób znalazłem to, czego brakuje:
jest WYMAGANY dla sieci WPA !!!!
Teraz działa :)
źródło
Jest to czynność, którą możesz podklasować, aby wymusić połączenie z określonym Wi-Fi: https://github.com/zoltanersek/android-wifi-activity/blob/master/app/src/main/java/com/zoltanersek/androidwifiactivity/ WifiActivity.java
Będziesz musiał podklasować to działanie i zaimplementować jego metody:
źródło
Na poziomie API 29
WifiManager.enableNetwork()
metoda jest przestarzała . Zgodnie z dokumentacją interfejsu API Androida (sprawdź tutaj ):Z poziomu interfejsu API 29, aby połączyć się z siecią Wi-Fi, musisz użyć
WifiNetworkSpecifier
. Przykładowy kod można znaleźć na https://developer.android.com/reference/android/net/wifi/WifiNetworkSpecifier.Builder.html#build ()źródło
Próbowałem także połączyć się z siecią. Żadne z powyższych rozwiązań nie działa dla hugerocka t70. Funkcja wifiManager.disconnect (); nie odłącza się od bieżącej sieci. Dlatego nie można ponownie połączyć się z określoną siecią. Zmodyfikowałem powyższy kod. Dla mnie kod bolow działa idealnie:
źródło
UID nnnnn does not have permission to update configuration xxxx. MD_START_CONNECT but no requests and connected, but app does not have sufficient permissions, bailing.
Wypróbuj tę metodę. To jest bardzo łatwe:
źródło