Как включить/выключить Wi-Fi программно?

Рейтинг: 1Ответов: 1Опубликовано: 20.03.2023

Не могу решить проблему с включением/выключением Wi-Fi программно в Android.

Прописал permissions:

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

Код, который использую для включения Wi-Fi:

WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(true);

Ошибок в логах никаких нет, программа не вылетает, и при вызове wifiManager.setWifiEnabled(true) ничего не происходит.

В чем может быть проблема?

Проверял как на своем телефоне, так и на эмуляторе — результат один и тот же.

Ответы

▲ 3Принят

Вы не уточнили какая версия андроида на ваших тестовых устройствах. Вы используете такой метод:

public boolean WifiManager.setWifiEnabled (boolean enabled)

то что пишется про него в документации:

This method was deprecated in API level 29. Starting with Build.VERSION_CODES#Q, applications are not allowed to enable/disable Wi-Fi. Compatibility Note: For applications targeting Build.VERSION_CODES.Q or above, this API will always return false and will have no effect. If apps are targeting an older SDK ( Build.VERSION_CODES.P or below), they can continue to use this API.

как вариант сделать проверку на версию андроида:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val panelIntent = Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY)
startActivityForResult(panelIntent, 0)
} else {
(this.context?.getSystemService(Context.WIFI_SERVICE) as? WifiManager)?.apply { isWifiEnabled = true /*or false*/ }
}

UPDATE:

так как startActivityForResult тоже Deprecated, вместо него нужно использовать:

var resultLauncher =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == Activity.RESULT_CANCELED) {
                
            }
        }

итоговая версия для Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q:

resultLauncher.launch(Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY))