I have following code which used to work well pre Android 10. But it is not able to turn wifi on in Android 10 devices.
WifiManager wifiMgr = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
boolean res = wifiMgr.setWifiEnabled(true);
//res value is set to false above because setWifiEnabled returns false on Android 10
Following are my permissions in AndroidManifest.xml
<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>
<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>
<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>
<uses-permission android:name=\"android.permission.INTERNET\"/>
<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>
I am even dynamically requesting for these permissions. But that doesn't seem to help as well.
Question:
Has anything changed on Android 10? Should I do something more to turn on wifi programatically from my app?
public boolean 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.
According to documentation, Apps
will not be able to turn Wi-Fi OFF/ON
anymore from Android-10 API level 29
[Until google provides an alternative solution].
For more information see official documentation.
And there is an issue 128554616 has been created in google issuetracker
about this.
You can still use the old API on older devices (see: official documentation), so here is what I do:
val wifiMgr = this.applicationContext.getSystemService(WIFI_SERVICE) as WifiManager
val alertDial: AlertDialog.Builder = AlertDialog.Builder(this)
//
//=============== Start Wi-Fi if needed ====================
// Check Wi-Fi state: 1=disabled WIFI_STATE_DISABLED
if (wifiMgr.wifiState == 1) {
alertDial.setMessage(R.string.wifi)
.setCancelable(false)
.setPositiveButton(R.string.yes) { _, _ -> // Enable wifi
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val panelIntent = Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY)
startActivityForResult(panelIntent, 0)
} else {
wifiMgr.isWifiEnabled = true
}
}
.setNegativeButton(R.string.no) { _, _ -> // Disable wifi
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val panelIntent = Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY)
startActivityForResult(panelIntent, 0)
} else {
wifiMgr.isWifiEnabled = false
}
}
alertDial.show()
}
}
The "wifiMgr.isWifiEnabled" is marked as deprecated, but still works on older devices.
As we are aware that the above mentioned google issue tracker mentions that we do not have a replacement api for the deprecated setWiFiEnabled, I guess we need to look out for alternatives and so I use InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc wifi enable"));
or InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc wifi disable"));
while running tests to toggle WiFi on devices with API 29 or above.
I don't know where the problem is, as Google is answering it already:
If apps are targeting an older SDK ( Build.VERSION_CODES.P or below), they can continue to use this API.
So change your Target SDK to 28 and it works fine on Android Q.
Or if you need to change WiFi State by second Apps like Tasker or Automate:
import androidx.appcompat.app.AppCompatActivity;
import android.net.wifi.WifiManager;
import android.content.Context;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Add WiFi On Part
WifiManager wifi = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled(true); // true or false to activate/deactivate wifi
// Add Toast if you want to
Toast toast = Toast.makeText(getApplicationContext(), "WiFi on", Toast.LENGTH_SHORT);
toast.show();
// Add Close Activity immediatelly
finish();
}
}
compileSdkVersion 30
buildToolsVersion "30.0.2"
defaultConfig {
applicationId "com.stackoverflow.example"
minSdkVersion 28
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.p1apps.wifion">
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<application
android:allowBackup="true"
...
Use Android Studio to install it on your phone.
Create a new Project like in 3. and name it WiFiOff and repeat all steps with changed lines in MainActivity:
...
wifi.setWifiEnabled(false); // true or false to activate/deactivate wifi
...
Toast toast = Toast.makeText(getApplicationContext(), "WiFi off",
...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With