如何通过亚行关闭Wifi?

时间:2012-04-05 18:11:58

标签: android shell adb android-wifi

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

我想要禁用/启用wifi或杀死wifi调用(com.movi​​al.wificall)并重新启动它。

是否可以通过adb和shell命令执行此操作?

到目前为止我找到了:

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

我只是不确定如何把它放在一起

13 个答案:

答案 0 :(得分:89)

通过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”here的更多信息。

答案 1 :(得分:44)

我正在寻找同样的功能来打开/关闭蓝牙,我发现了这个:

adb shell svc wifi enable|disable

答案 2 :(得分:24)

在非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命令:

$ adb shell am start -n org.mytools.config/.MainActivity -e wifi true
$ adb shell am start -n org.mytools.config/.MainActivity -e wifi false

答案 3 :(得分:5)

  1. 转到位置android/android-sdk/platform-tools
  2. shift +右键单击
  3. 在此处打开cmd并键入以下命令

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

答案 4 :(得分:3)

adb shell "svc wifi enable"

这个工作&amp;它在后台进行操作而无需打开相关选项!!

答案 5 :(得分:3)

我测试了这个命令:

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

答案 6 :(得分:0)

使用引号

例如: adb shell "svc wifi enable"

这将有效:)

答案 7 :(得分:0)

我可以这样做:

func RequestCameraAccess() {
    AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo, completionHandler: { (granted: Bool) -> Void in
        if granted == true {
            print("User Granted")
            DispatchQueue.main.async {
                self.Cam();
            }
        } else {
            print("User Rejected")
            DispatchQueue.main.async {
                self.image1.isHidden = true
            }

        }
    })
}

有时候,如果在开机期间完成(即修复bootloop such as this),它就不适用,你也可以先行启用飞机模式:

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

使用(无根)股票模式在LG G5(SE)的Android 7中测试。

答案 8 :(得分:0)

所有这些input keyevent组合都是依赖Android /硬件的,这很痛苦。

但是,我终于找到了旧的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"

答案 9 :(得分: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中心作为实验,以查看是否可以以相同的方式启用它。

答案 10 :(得分:0)

以下方法不需要root ,并且可以在任何地方使用(根据docs,即使您使用targetSdkVersion = 28,即使在Android Q +上也是如此)。

  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别名,以调用这些命令。

根据您的设备,您可能需要其他权限。

答案 11 :(得分:0)

ADB Connect to wifi with credentials :

您可以使用以下ADB命令连接到wifi并输入密码:

adb等待设备外壳启动-n com.android.settingstest / .wifi.WifiSettings -e WIFI 1 -e AccessPointName“ enter_user_name” -e密码“ enter_password”

答案 12 :(得分:0)

在Android测试中,我这样做是: InstrumentationRegistry.getInstrumentation()。getUiAutomation()。executeShellCommand(“ svc wifi enable ”) InstrumentationRegistry.getInstrumentation()。getUiAutomation()。executeShellCommand(“ svc wifi disable ”)