在Android 29上启用或禁用WiFi

10
public boolean WifiManager.setWifiEnabled (boolean enabled)

此方法在API级别29中已被弃用。从Build.VERSION_CODES#Q开始,应用程序不允许启用/禁用Wi-Fi。 兼容性说明:针对Build.VERSION_CODES.Q或更高版本的应用程序,此API将始终返回false并且不会产生任何影响。 如果应用程序针对较旧的SDK(Build.VERSION_CODES.P或更低版本),则可以继续使用此API。

如何在Android 29上禁用WiFi?


3
这是预期的行为,不会修复,这很糟糕,Android 10 总体表现不佳。 Scoped storage 是最令人讨厌的。 - Pemba Tamang
5个回答

4

检测操作系统版本的更为简单的方法是:

if (Build.VERSION.SDK_INT<Build.VERSION_CODES.Q)
   wifiManager.setWifiEnabled(status);
else
{
   Intent panelIntent = new Intent(Settings.Panel.ACTION_WIFI);
   startActivityForResult(panelIntent,1);
}

如果操作系统版本低于Android Q,则使用WifiManager类对象来启用/禁用Wi-Fi的使用;否则,使用隐式意图来禁用Wi-Fi。


如果 targetSdkVersion < 29,则 wifiManager.setWifiEnabled 在所有 Android 版本上都能正常工作,包括更新的版本。如果 targetSdkVersion >= 29,则 wifiManager.setWifiEnabled 在所有 Android 版本上都会失败并返回 false ,包括旧版本。那么这个 if-else 逻辑有什么意义呢? - A.J.

4
在Android Q(Android 10,API级别29)中,您不能再以编程方式启用/禁用wifi,请使用“设置面板”来切换wifi连接:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    val panelIntent = Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY)
    startActivityForResult(panelIntent, 0)
} else {
    // add appropriate permissions to AndroidManifest file (see https://dev59.com/dW865IYBdhLWcg3wNLw7#61289575)
    (this.context?.getSystemService(Context.WIFI_SERVICE) as? WifiManager)?.apply { isWifiEnabled = true /*or false*/ }
}

3

已解决!

private void setWifiEnabled(boolean enabled) {
    try {
        Runtime.getRuntime().exec(new String[] { "su", "-c", "svc wifi", enabled ?
                "enable" :
                "disable" });
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}

愉快地使用 API 29 进行编程。

显然,这需要 root 权限。

不需要 android.permission.CHANGE_WIFI_STATE 权限。


另一种变体在https://dev59.com/ILbna4cB1Zd3GeqPb4FR#63262649。 - Shredder

1

Android Q已经限制了这个功能,开发者无法通过编程方式禁用wifi。如果你的targetSdkVersion <= 28,则你的应用程序将继续工作并可以禁用wifi。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接