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);
Рохит Шарма
источник
1
Получили ли вы какое-нибудь решение для опции отключения мобильных данных?
Parthi

Ответы:

186

Я знаю о включении или отключении Wi-Fi:

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
3
Это отличается от wifiManager.reconnect ()? А как насчет wifiManager.reassociate ()? Также в подходе выше, если вы хотите сбросить Wi-Fi, можете ли вы вызвать wifiManager.setWifiEnabled (false) и wifiManager.setWifiEnabled (true) подряд? Или вам придется сначала отключить его, а затем дождаться какого-либо сигнала (широковещательный приемник и т. Д.), Прежде чем снова включить его?
Marchy
Если вам нужен демонстрационный учебник, то его здесь: demoadda.com/demo/android/…
Кишан Дхамат
“<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />”тоже нужен.
zionpi
Можно ли управлять WiFi в устройстве M из приложения?
Nithinjith 01
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);

Примечание. Для доступа к состоянию WiFi мы должны добавить следующие разрешения в файл 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 02
1
UPDATE_DEVICE_STATS только для системных приложений
Мариенке
С Android Q нельзя напрямую включать / выключать Wi-Fi
Равиндра Кушваха,
13

Полное решение:

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
Отсутствует вызов для установки диспетчера Wi-Fi с конфигурацией Wi-Fi: 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, перейдите по ссылке на мой сайт .

Хемант Менди Ратта
источник
4

В Android Q (Android 10) вы больше не можете включать / отключать Wi-Fi программно. Используйте панель настроек для переключения подключения к 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.

Франклин84
источник
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) и далее Wi-Fi не может быть включен / отключен, вам нужно открыть настройку,

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