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
This question is related to
android
shell
adb
android-wifi
Enable:
adb shell su -c 'svc wifi enable'
Disable:
adb shell su -c 'svc wifi disable'
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.
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"
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.
use with quotes
ex: adb shell "svc wifi enable"
this will work :)
I was searching for the same to turn bluetooth on/off, and I found this:
adb shell svc wifi enable|disable
android/android-sdk/platform-tools
open cmd here and type the following commands
adb shell
su
svc wifi enable/disable
done!!!!!
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
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"
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.
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.
In Android tests I'm doing so: InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc wifi enable") InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc wifi disable")
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.
adb shell "svc wifi enable"
This worked & it makes action in background without opening related option !!
Source: Stackoverflow.com