繁体   English   中英

在 Android 29 上启用禁用 WiFi

[英]Enable Disable WiFi on Android 29

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?

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://stackoverflow.com/questions/3930990/android-how-to-enable-disable-wifi-or-internet-connection-programmatically/61289575)
    (this.context?.getSystemService(Context.WIFI_SERVICE) as? WifiManager)?.apply { isWifiEnabled = true /*or false*/ }
}

Android Q 对此进行了限制,开发人员无法以编程方式禁用 wifi。 如果您的 targetSdkVersion <= 28,您的应用程序将继续工作并且可以禁用 wifi

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

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 class object 来启用/禁用 Wi-Fi 的使用; 否则,使用隐式 Intent 禁用 Wi-Fi。

根据 Google 的说法,从 Android Q 开始的应用程序将不允许切换 WiFi。

这是他们的问题跟踪器上的问题: https://issuetracker.google.com/issues/128554616

解决了!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM