62

我正在自动化 wifi 呼叫的测试程序,我想知道有没有办法通过 adb 关闭/打开 wifi?

我想禁用/启用 wifi 或终止 wifi 呼叫(com.movi​​al.wificall)并重新启动它。

是否可以通过 adb 和 shell 命令来完成这一切?

到目前为止,我发现:

android.net.wifi.WifiManager
setWifiEnabled(true/false)

我只是不知道如何把它放在一起

4

14 回答 14

102

通过 ADB 使用“svc”(需要 root 权限):

使能够:

adb shell su -c 'svc wifi enable'

禁用:

adb shell su -c 'svc wifi disable'

通过 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

第一行启动“wifi.WifiSettings”活动,打开 WiFi 设置页面。第二行模拟按键。

我在 Droid X 上测试了这两行。但由于设置布局不同,上述关键事件可能需要在其他设备中进行编辑。

更多关于“keyevents”的信息在这里

于 2012-04-06T02:48:20.147 回答
68

我正在寻找相同的方法来打开/关闭蓝牙,我发现了这个:

adb shell svc wifi enable|disable
于 2012-07-13T14:41:00.817 回答
26

在非 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
于 2012-09-14T08:18:47.743 回答
13
adb shell "svc wifi enable"

这有效并且它在后台执行操作而无需打开相关选项!

于 2013-05-09T05:29:11.963 回答
7
  1. 去位置android/android-sdk/platform-tools
  2. shift+右键单击
  3. 在此处打开 cmd 并键入以下命令

    1. adb shell
    2. su
    3. svc wifi enable/disable
  4. 完毕!!!!!

于 2015-10-29T08:38:17.080 回答
5

我测试了这个命令:

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 权限。

于 2015-06-08T14:26:19.003 回答
2

与引号一起使用

前任:adb shell "svc wifi enable"

这将工作:)

于 2013-01-24T14:02:38.993 回答
2

我可以这样做:

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 进行了测试。

于 2017-11-21T18:49:06.747 回答
1

所有这些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"
于 2019-12-10T19:15:49.243 回答
1

通过 Android 11 上的 cmd 命令(无需 root)

启用 WIFI(打开):

adb shell cmd -w wifi set-wifi-enabled enable 

禁用 WIFI(关闭):

adb shell cmd -w wifi set-wifi-enabled disable
于 2021-08-15T19:31:58.077 回答
0

这适用于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 中心作为实验,看看您是否可以以相同的方式启用它。

于 2020-02-10T17:06:29.557 回答
0

以下方法不需要 root并且应该可以在任何地方工作(根据docs,即使在 Android Q+ 上,如果你保留targetSdkVersion = 28)。

  1. 制作一个空白应用程序。

  2. 创建一个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
    }
    
  3. AndroidManifest.xml连同必要的许可一起声明:

    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    
    <application>
    
        <provider
            android:name=".ApiProvider"
            android:authorities="wifi"
            android:exported="true" />
    </application>
    
  4. 构建应用程序并安装它。

  5. 亚行致电:

    adb shell content query --uri content://wifi/enable
    adb shell content query --uri content://wifi/disable
    
  6. 使用调用这些命令的短名称创建批处理脚本/shell 函数/shell 别名。

根据您的设备,您可能需要额外的权限。

于 2020-06-05T19:33:54.390 回答
0

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"

于 2020-09-25T06:11:25.877 回答
0

在Android测试中我这样做: InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc wifi enable ") InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc wifi disable ")

于 2020-10-22T07:27:37.020 回答