Android: Jak programowo włączyć / wyłączyć połączenie Wi-Fi lub połączenie internetowe

82

Korzystając z klasy Connectivity Manager możemy uzyskać dostęp do sieci WiFi lub Internet:

ConnectivityManager connec = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

// ARE WE CONNECTED TO THE NET
if ( connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED ||
  connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED ) {
  // ...
}

gdzie 0i 1odpowiednio odnosi się do połączenia mobilnego i Wi-Fi

Jeśli moje urządzenie z Androidem jest podłączone do obu, czy możemy przełączać się między którąkolwiek z sieci, czy też możemy wyłączyć dowolną z sieci? Podobnie jak w przypadku korzystania z funkcji:

connec.getNetworkInfo(0).setState(NetworkInfo.State.DISCONNECTED);
Rohit Sharma
źródło
1
Czy masz jakieś rozwiązanie dla opcji wyłączania danych mobilnych?
Parthi

Odpowiedzi:

186

Wiem o włączaniu lub wyłączaniu Wi-Fi:

WifiManager wifiManager = (WifiManager)this.context.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(status);

gdzie status może być truelub falsezgodnie z wymaganiami.

Edytować:

Potrzebujesz również następujących uprawnień w pliku manifestu:

 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> 
viv
źródło
47
Również w manifeście:<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
Comic Sans MS Lover
3
Czy różni się to od funkcji wifiManager.reconnect ()? A co z wifiManager.reassociate ()? Również w powyższym podejściu, jeśli chcesz zresetować WiFi, czy możesz zadzwonić do wifiManager.setWifiEnabled (false) i wifiManager.setWifiEnabled (true) z powrotem do tyłu? A może musiałbyś go najpierw wyłączyć, a następnie poczekać na jakiś sygnał (odbiornik transmisji itp.), Zanim włączysz go ponownie?
Marchy
Jeśli chcesz zobaczyć samouczek demo, to jest tutaj: demoadda.com/demo/android/ ...
Kishan Dhamat
“<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />”jest również potrzebne.
zionpi
Czy można kontrolować WiFi w urządzeniu M z poziomu aplikacji?
Nithinjith
30

Aby włączyć WiFi:

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled(true);

Aby wyłączyć WiFi:

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled(false);

Uwaga: aby uzyskać dostęp ze stanem WiFi, musimy dodać następujące uprawnienia w pliku AndroidManifest.xml:

android.permission.ACCESS_WIFI_STATE
android.permission.UPDATE_DEVICE_STATS 
android.permission.CHANGE_WIFI_STATE
Valeh Ağayev
źródło
4
tylko CHANGE_WIFI_STATE jest konieczne, przynajmniej w Androidzie 4.2
voghDev
1
UPDATE_DEVICE_STATS jest tylko dla aplikacji systemowych
marienke
Z Androida Q nie można bezpośrednio włączać / wyłączać Wi
Ravindra Kushwaha
12

Kompletne rozwiązanie:

try {
    WifiManager wifi = (WifiManager) 
        context.getSystemService(Context.WIFI_SERVICE);

    WifiConfiguration wc = new WifiConfiguration();
    wc.SSID = "\"SSIDName\"";
    wc.preSharedKey  = "\"password\"";
    wc.hiddenSSID = true;
    wc.status = WifiConfiguration.Status.ENABLED; 

    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);

    wc.allowedPairwiseCiphers
        .set(WifiConfiguration.PairwiseCipher.TKIP);
    wc.allowedPairwiseCiphers
        .set(WifiConfiguration.PairwiseCipher.CCMP);
    wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);

    boolean b=wifi.isWifiEnabled();
    if (b) {
        wifi.setWifiEnabled(false);
        Toast.makeText(context, "yes", Toast.LENGTH_SHORT).show();
    } else {
        wifi.setWifiEnabled(true);
        Toast.makeText(context, "no", Toast.LENGTH_SHORT).show();
    }
    //Log.d("WifiPreference", "enableNetwork returned " + b );

} catch (Exception e) {
    e.printStackTrace();
}

Źródła: http://amitkumar-android.blogspot.com/p/installation-steps.html

Amit kumar
źródło
1
Brak wezwania do ustawienia menedżera Wi-Fi z konfiguracją Wi-Fi: wifi.addNetwork (wc);
Błąd 454
4
Dlaczego miałbyś na stałe zakodować swój identyfikator SSID i hasło? Nie jest to dobry pomysł.
lifeson106
@ lifeson106 Myślę, że to tylko w celu demonstracji.
Bertram Gilfoyle
4

Aby włączyć wyłączenie Wi-Fi, użyj WifiManagerklasy, aby uzyskać usługi systemowe (urządzenie z systemem Android) dla Wi-Fi:

WifiManager wifi =(WifiManager)getSystemService(Context.WIFI_SERVICE); 

Teraz obiekt wifiz WifiManagerklasy służy do uzyskania statusu WiFi:

if(wifi.isWifiEnabled())
    //Perform Operation
else
    //Other Operation

A co najważniejsze, nie zapomnij dać następujących uprawnień w swoim pliku manifestu Androida:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

Aby uzyskać szczegółowe informacje i pełny przykładowy kod projektu do włączania / wyłączania Wi-Fi na Androidzie, odwiedź link do mojej witryny .

Hemant Mendi Ratta
źródło
4

W systemie Android Q (Android 10) nie można już programowo włączać / wyłączać Wi-Fi. Użyj panelu ustawień, aby przełączyć łączność Wi-Fi:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    val panelIntent = Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY)
    startActivityForResult(panelIntent, 0)
} else {
    // use previous solution, add appropriate permissions to AndroidManifest file (see answers above)
    (this.context?.getSystemService(Context.WIFI_SERVICE) as? WifiManager)?.apply { isWifiEnabled = true /*or false*/ }
}
Siergiej
źródło
1

dodaj to uprawnienie do swojego manifestu, a następnie użyj powyższego kodu, aby zmienić stan Wi-Fi:

 <!--permission ge enable and disable WIFI in android-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
varun bhardwaj
źródło
1

Nie mogłem uzyskać bezpośredniego dostępu do obiektu kontekstu.
Moje rozwiązanie jest następujące:

Context appContext = Android.App.Application.Context;
var wifiManager = (WifiManager)appContext.GetSystemService(WifiService);
wifiManager.SetWifiEnabled(state);

Musiałem też zmienić niektóre pisma np. WIFI_SERVICE a WifiService.

Franklin84
źródło
0

Możliwe jest włączanie / wyłączanie Wi-Fi na urządzeniach z systemem starszym niż Android 10 przy użyciu następującego kodu:

WifiManager wifiManager = 
(WifiManager)this.context.getSystemService(Context.WIFI_SERVICE);

wifiManager.setWifiEnabled (stan);

Ale pamiętaj , że nie można już tego zrobić na Androidzie 10 i prawdopodobnie również.
https://issuetracker.google.com/issues/141011684

AdeleGoldberg
źródło
0

Android 10 (Q) i nowsze Wi-Fi nie mogą być włączone / wyłączone, musisz otworzyć zamiar ustawienia,

// for android Q and above
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            Intent panelIntent = new 
Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY);
            startActivityForResult(panelIntent, 0);
        } else {
            // for previous android version
            WifiManager wifiManager = (WifiManager) 
this.getApplicationContext().getSystemService(WIFI_SERVICE);
            wifiManager.setWifiEnabled(true);
        }

W oczywisty sposób

 <uses-permission
    android:name="android.permission.CHANGE_WIFI_STATE"
    android:required="true" />
RHL
źródło
0

Ta metoda jest obecnie przestarzała, począwszy od systemu Android Q.

Spróbuj To naprawdę pomoże.

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {// if build version is less than Q try the old traditional method
                    if (!wifiManager.isWifiEnabled()) {
                        wifiManager.setWifiEnabled(true);
                        btnOnOff.setText("Wifi ONN");
                    } else {
                        wifiManager.setWifiEnabled(false);
                        btnOnOff.setText("Wifi OFF");
                    }
                } else {// if it is Android Q and above go for the newer way    NOTE: You can also use this code for less than android Q also
                    Intent panelIntent = new Intent(Settings.Panel.ACTION_WIFI);
                    startActivityForResult(panelIntent, 1);
                }
Shivam Anand
źródło
Warto wskazać nową / preferowaną metodę z przykładem?
user1016765
To nie daje odpowiedzi na pytanie. Gdy zdobędziesz wystarczającą reputację , będziesz mógł komentować każdy post ; zamiast tego udziel odpowiedzi, które nie wymagają wyjaśnień od pytającego . - Z recenzji
Ryan M