How to turn off Wifi via ADB?
AndroidShellAdbAndroid WifiAndroid Problem Overview
Im automating a testing procedure for wifi calling and I was wondering is there a way to turn off/on wifi via adb?
I would either like to disable/enable wifi or kill wifi calling (com.movial.wificall) and restart it.
Is it possible to do this all via adb and shell commands?
so far I have found:
android.net.wifi.WifiManager
setWifiEnabled(true/false)
Im just not sure how to put it together
Android Solutions
Solution 1 - Android
#Using "svc" through ADB (rooted required):
Enable:
adb shell su -c 'svc wifi enable'
Disable:
adb shell su -c 'svc wifi disable'
#Using Key Events through ADB:
adb shell am start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiSettings
adb shell input keyevent 20 & adb shell input keyevent 23
The first line launch "wifi.WifiSettings" activity which open the WiFi Settings page. The second line simulate key presses.
I tested those two lines on a Droid X. But Key Events above probably need to edit in other devices because of different Settings layout.
More info about "keyevents" here.
Solution 2 - Android
I was searching for the same to turn bluetooth on/off, and I found this:
adb shell svc wifi enable|disable
Solution 3 - Android
Simple way to switch wifi on non-rooted devices is to use simple app:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WifiManager wfm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
try {
wfm.setWifiEnabled(Boolean.parseBoolean(getIntent().getStringExtra("wifi")));
} catch (Exception e) {
}
System.exit(0);
}
}
AndroidManifest.xml:
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
ADB commands:
$ adb shell am start -n org.mytools.config/.MainActivity -e wifi true
$ adb shell am start -n org.mytools.config/.MainActivity -e wifi false
Solution 4 - Android
-
go to location
android/android-sdk/platform-tools
-
shift+right click
-
open cmd here and type the following commands
adb shell
su
svc wifi enable/disable
-
done!!!!!
Solution 5 - Android
I tested this command:
adb shell am start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiSettings
adb shell input keyevent 19 && adb shell input keyevent 19 && adb shell input keyevent 23
and only works on window's prompt, maybe because of some driver
The adb shell svc wifi enable|disable
solution only works with root permissions.
Solution 6 - Android
It will work if you use with quotes:
adb shell "svc wifi enable"
Solution 7 - Android
I can just do:
settings put global wifi_on 0
settings put global wifi_scan_always_enabled 0
Sometimes, if done during boot (i.e. to fix bootloop such as this), it doesn't apply well and you can proceed also enabling airplane mode first:
settings put global airplane_mode_on 1
settings put global wifi_on 0
settings put global wifi_scan_always_enabled 0
Other option is to force this with:
while true; do settings put global wifi_on 0; done
Tested in Android 7 on LG G5 (SE) with (unrooted) stock mod.
Solution 8 - Android
Via cmd command on Android 11 & 12 (no-root-required)
enable Wi-Fi (turn on):
adb shell cmd -w wifi set-wifi-enabled enabled
disable Wi-Fi (turn off):
adb shell cmd -w wifi set-wifi-enabled disabled
Solution 9 - Android
All these input keyevent
combinations are SO android/hardware dependent, it's a pain.
However, I finally found the combination for my old android 4.1 device :
adb shell am start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiSettings
adb shell "input keyevent KEYCODE_DPAD_LEFT;input keyevent KEYCODE_DPAD_RIGHT;input keyevent KEYCODE_DPAD_CENTER"
Solution 10 - Android
This works as of android 7.1.1, non-rooted
adb shell am start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiSettings && adb shell input keyevent 23 && adb shell input keyevent 23
This will launch the activity and then send the DPAD center keyevent. I added another DPAD center as an experiment to see if you can enable it in the same way.
Solution 11 - Android
The following method doesn't require root and should work anywhere (according to docs, even on Android Q+, if you keep targetSdkVersion = 28
).
-
Make a blank app.
-
Create a
ContentProvider
:class ApiProvider : ContentProvider() { private val wifiManager: WifiManager? by lazy(LazyThreadSafetyMode.NONE) { requireContext().getSystemService(WIFI_SERVICE) as WifiManager? } private fun requireContext() = checkNotNull(context) private val matcher = UriMatcher(UriMatcher.NO_MATCH).apply { addURI("wifi", "enable", 0) addURI("wifi", "disable", 1) } override fun query(uri: Uri, projection: Array<out String>?, selection: String?, selectionArgs: Array<out String>?, sortOrder: String?): Cursor? { when (matcher.match(uri)) { 0 -> { enforceAdb() withClearCallingIdentity { wifiManager?.isWifiEnabled = true } } 1 -> { enforceAdb() withClearCallingIdentity { wifiManager?.isWifiEnabled = false } } } return null } private fun enforceAdb() { val callingUid = Binder.getCallingUid() if (callingUid != 2000 && callingUid != 0) { throw SecurityException("Only shell or root allowed.") } } private inline fun <T> withClearCallingIdentity(block: () -> T): T { val token = Binder.clearCallingIdentity() try { return block() } finally { Binder.restoreCallingIdentity(token) } } override fun onCreate(): Boolean = true override fun insert(uri: Uri, values: ContentValues?): Uri? = null override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array<out String>?): Int = 0 override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int = 0 override fun getType(uri: Uri): String? = null }
-
Declare it in
AndroidManifest.xml
along with necessary permission:<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <application> <provider android:name=".ApiProvider" android:authorities="wifi" android:exported="true" /> </application>
-
Build the app and install it.
-
Call from ADB:
adb shell content query --uri content://wifi/enable adb shell content query --uri content://wifi/disable
-
Make a batch script/shell function/shell alias with a short name that calls these commands.
Depending on your device you may need additional permissions.
Solution 12 - Android
ADB Connect to wifi with credentials :
You can use the following ADB command to connect to wifi and enter password as well :
adb wait-for-device shell am start -n com.android.settingstest/.wifi.WifiSettings -e WIFI 1 -e AccessPointName "enter_user_name" -e Password "enter_password"
Solution 13 - Android
In Android tests I'm doing as follows:
InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc wifi **enable**")
InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc wifi **disable**")