我正在自动化 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 svc wifi enable|disable
在非 root 设备上切换 wifi 的简单方法是使用简单的应用程序:
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 shell am start -n org.mytools.config/.MainActivity -e wifi true
$ adb shell am start -n org.mytools.config/.MainActivity -e wifi false
adb shell "svc wifi enable"
这有效并且它在后台执行操作而无需打开相关选项!
android/android-sdk/platform-tools
在此处打开 cmd 并键入以下命令
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
并且仅适用于窗口的提示,可能是因为某些驱动程序
该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
在 LG G5 (SE) 上的 Android 7 中使用(无根)stock mod 进行了测试。
所有这些input keyevent
组合都依赖于安卓/硬件,这很痛苦。
但是,我终于找到了我的旧 android 4.1 设备的组合:
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"
adb shell cmd -w wifi set-wifi-enabled enable
adb shell cmd -w wifi set-wifi-enabled disable
这适用于android 7.1.1,无根
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
这将启动活动,然后发送 DPAD 中心键事件。我添加了另一个 DPAD 中心作为实验,看看您是否可以以相同的方式启用它。
以下方法不需要 root并且应该可以在任何地方工作(根据docs,即使在 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("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
}
AndroidManifest.xml
连同必要的许可一起声明:
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<application>
<provider
android:name=".ApiProvider"
android:authorities="wifi"
android:exported="true" />
</application>
构建应用程序并安装它。
亚行致电:
adb shell content query --uri content://wifi/enable
adb shell content query --uri content://wifi/disable
使用调用这些命令的短名称创建批处理脚本/shell 函数/shell 别名。
根据您的设备,您可能需要额外的权限。
ADB Connect to wifi with credentials :
您可以使用以下 ADB 命令连接到 wifi 并输入密码:
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"
在Android测试中我这样做: InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc wifi enable ") InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc wifi disable ")