Android: Як програмно ввімкнути / вимкнути з’єднання Wi-Fi або Інтернету


82

За допомогою класу Менеджера зв’язків ми можемо отримати доступ до Wi-Fi або Інтернет-мережі:

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 ) {
  // ...
}

де 0і 1відповідно відноситься до мобільного та wi-fi з'єднання

Якщо мій пристрій Android підключений до обох, чи можемо ми переключатися між будь-якими мережами чи можемо відключити будь-яку мережу? Як використання функції:

connec.getNetworkInfo(0).setState(NetworkInfo.State.DISCONNECTED);

Чи отримали ви якесь рішення щодо відключення мобільних даних?
Парті

Відповіді:


183

Я знаю, як увімкнути або вимкнути wifi:

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

де статус може бути trueабо falseвідповідно до вимог.

Редагувати:

Вам також потрібні такі дозволи у вашому файлі маніфесту:

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

47
Також у маніфесті:<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
Comic Sans MS Lover

2
Чи відрізняється це від wifiManager.reconnect ()? А як щодо wifiManager.reassociate ()? Також у наведеному вище підході, якщо ви хочете скинути Wi-Fi, чи можете ви зателефонувати wifiManager.setWifiEnabled (false) та wifiManager.setWifiEnabled (true) спиною до спини? Або вам доведеться відключити його спочатку, а потім почекати якийсь сигнал (широкомовний приймач тощо), перш ніж вмикати знову?
березень

Якщо ви хочете демонстраційний посібник fot, тоді тут: demoadda.com/demo/android/…
Kishan Dhamat

“<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />”також потрібно.
zionpi

Чи можна керувати WiFi в пристрої M за допомогою програми?
Нітінджіт

30

Щоб увімкнути Wi-Fi:

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

Щоб вимкнути Wi-Fi:

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

Примітка. Щоб отримати доступ до стану Wi-Fi, ми повинні додати такі дозволи всередині файлу AndroidManifest.xml:

android.permission.ACCESS_WIFI_STATE
android.permission.UPDATE_DEVICE_STATS 
android.permission.CHANGE_WIFI_STATE

4
потрібно лише CHANGE_WIFI_STATE, принаймні в Android 4.2
voghDev

1
UPDATE_DEVICE_STATS призначений лише для системних програм
marienke,

З Android Q ви не можете безпосередньо
вмикати

12

Повне рішення:

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();
}

Посилання: http://amitkumar-android.blogspot.com/p/installation-steps.html


1
Відсутній виклик для встановлення диспетчера wifi з конфігурацією wifi: wifi.addNetwork (wc);
Помилка 454,

4
Чому ви повинні кодувати свій SSID та пароль? Не гарна ідея.
lifeson106

@ lifeson106 Я думаю, що це лише з метою демонстрації.
Бертрам Гілфойл

4

Щоб увімкнути вимкнення Wi-Fi, використовуйте WifiManagerклас, щоб отримати системні (пристрої Android) послуги для Wi-Fi:

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

Тепер об'єкт wifiз WifiManagerкласу використовується для отримання статусу Wi - Fi:

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

І найголовніше, не забудьте дати такий дозвіл у своєму файлі маніфесту Android:

<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" />

Щоб отримати детальну інформацію та повний зразок коду проекту для ввімкнення / вимкнення Wi-Fi під час відвідування Android посилання на мій веб-сайт .


3

В Android Q (Android 10) ви більше не можете програмно вмикати / вимикати wifi. Використовуйте панель налаштувань для перемикання з’єднання 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*/ }
}

1

додайте цей дозвіл у свій маніфест, а потім використовуйте наведений вище код для зміни стану WiFi:

 <!--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"/>

1

Я не міг отримати безпосередній доступ до об’єкта контексту.
Моє рішення таке:

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

Також мені довелося змінити деякі твори, наприклад. WIFI_SERVICE проти WifiService.


0

Можна ввімкнути / вимкнути Wi-Fi на попередніх пристроях Android 10, використовуючи такий код:

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

wifiManager.setWifiEnabled (статус);

Але зауважте, що це більше неможливо зробити на Android 10, і, ймовірно, також вперед.
https://issuetracker.google.com/issues/141011684


0

Android 10 (Q) і далі wifi не можна вмикати / вимикати, вам потрібно відкрити намір налаштування,

// 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);
        }

У маніфесті,

 <uses-permission
    android:name="android.permission.CHANGE_WIFI_STATE"
    android:required="true" />

0

Зараз цей метод застарілий, починаючи з Android Q.

Спробуйте Це дійсно допоможе.

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);
                }

Варто вказати на новий / бажаний метод на прикладі?
user1016765

Це не дає відповіді на запитання. Отримавши достатню репутацію, ви зможете коментувати будь-яку публікацію ; натомість надайте відповіді, які не вимагають роз’яснень від запитувача . - З огляду
Ryan M
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.