我正在为WiFi通话自动化测试过程编写脚本,我想知道是否可以通过adb打开/关闭WiFi?
我希望能够禁用/启用WiFi或关闭WiFi通话(com.movial.wificall)并重新启动它。
是否可以通过adb和shell命令来完成所有这些操作?
到目前为止,我已经找到了:
android.net.wifi.WifiManager
setWifiEnabled(true/false)
我只是不确定如何把它放在一起。
我正在为WiFi通话自动化测试过程编写脚本,我想知道是否可以通过adb打开/关闭WiFi?
我希望能够禁用/启用WiFi或关闭WiFi通话(com.movial.wificall)并重新启动它。
是否可以通过adb和shell命令来完成所有这些操作?
到目前为止,我已经找到了:
android.net.wifi.WifiManager
setWifiEnabled(true/false)
我只是不确定如何把它放在一起。
启用:
adb shell su -c 'svc wifi enable'
禁用:
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
第一行启动“wifi.WifiSettings”活动,打开WiFi设置页面。第二行模拟按键操作。
我在Droid X上测试了这两行代码。但是由于不同的设置布局,上面的按键事件可能需要在其他设备上进行编辑。
关于“keyevents”的更多信息,请参见此处。
adb shell input keyevent 19&adb shell input keyevent 19&adb shell input keyevent 23
(第一个也可以是20)- 如果在进入wifi设置屏幕时没有选项被选择,则此方法有效(如果有选项被选择,则应跳过第一个事件)。 - Bartek Lipinskisu
,就像 @IvanMorgillo 所说的那样:adb shell su -c 'svc wifi disable'
。 - Aquarius Power我也在寻找如何打开/关闭蓝牙,后来我找到了这个:
adb shell svc wifi enable|disable
adb shell su -c 'svc wifi enable'
则无法使用(因为它没有root权限)。 - trevren11非 root 设备上打开 Wi-Fi 的简单方法是使用一个简单的应用程序:
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命令:
$ adb shell am start -n org.mytools.config/.MainActivity -e wifi true
$ adb shell am start -n org.mytools.config/.MainActivity -e wifi false
启用Wi-Fi(打开):
adb shell cmd -w wifi set-wifi-enabled enabled
禁用 Wi-Fi(关闭):
adb shell cmd -w wifi set-wifi-enabled disabled
enable
/disable
而不是enabled
/disabled
,则该命令会返回Invalid args for set-wifi-enabled: java.lang.IllegalArgumentException: Expected 'enabled' or 'disabled' as next arg but got 'disable'
/[...] but got 'enable'
错误。 - user598527android/android-sdk/platform-tools
打开命令提示符并输入以下命令
adb shell
su
svc wifi enable/disable
完成!!!
我测试了这个命令:
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
对于只能在Windows提示符下使用的情况,可能是因为某些驱动程序的原因。
adb shell svc wifi enable|disable
解决方案只有在获取了 root 权限后才能使用。
adb shell "svc wifi enable"
settings put global wifi_on 0
settings put global wifi_scan_always_enabled 0
settings put global airplane_mode_on 1
settings put global wifi_on 0
settings put global wifi_scan_always_enabled 0
while true; do settings put global wifi_on 0; done
input keyevent
组合都非常依赖于Android/硬件,这真的很痛苦。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"
下面这个方法不需要root权限,应该可以在任何地方使用(根据文档,即使在Android Q+上,只要你保持targetSdkVersion = 28
)。
创建一个空白应用。
创建一个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("只允许使用 shell 或 root 用户。")
}
}
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
}
在AndroidManifest.xml
中声明它,并添加必要的权限:
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<application>
<provider
android:name=".ApiProvider"
android:authorities="wifi"
android:exported="true" />
</application>
构建应用并安装。
从ADB调用:
adb shell content query --uri content://wifi/enable
adb shell content query --uri content://wifi/disable
创建一个批处理脚本/Shell函数/Shell别名,使用简短的名称调用这些命令。
根据您的设备,您可能需要额外的权限。