安卓:如何通过编程启用/禁用Wifi或互联网连接

91

通过使用连接管理器类,我们可以访问WiFi或互联网网络:

ConnectivityManager connec = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

// ARE WE CONNECTED TO THE NET
if ( connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED ||
  connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED ) {
  // ...
}

其中01分别代表移动网络和WiFi连接。

如果我的Android设备同时连接了两种网络,我能否在这些网络之间切换,或者禁用其中的任何一个网络?就像使用一个函数:

connec.getNetworkInfo(0).setState(NetworkInfo.State.DISCONNECTED);

1
你有没有找到禁用移动数据选项的解决方案? - Parthi
10个回答

188

我知道如何开启或关闭Wi-Fi:

WifiManager wifiManager = (WifiManager)this.context.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(status);

状态可能是truefalse,具体取决于需求。

编辑:

您还需要在清单文件中添加以下权限:

 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> 

48
同样在清单文件中:<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> - Comic Sans MS Lover
3
这与wifiManager.reconnect()有什么不同?wifiManager.reassociate()呢?另外,如果你想重置WiFi,你可以连续调用wifiManager.setWifiEnabled(false)和wifiManager.setWifiEnabled(true)吗?还是说你需要先禁用它,然后等待某个信号(广播接收器等),再重新启用它? - Marchy
如果您想要演示教程,则在此处:http://www.demoadda.com/demo/android/turn-wifi-on-off-programatically-android_98 - Kishan Dhamat
还需要“<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />”这个权限。 - zionpi
从应用程序中控制M设备的WiFi是否可能? - Nithinjith
1
在API级别29中已弃用。请参见BigSt的答案 - M Imam Pratama

32

启用WiFi:

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled(true);

禁用 WiFi:

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled(false);

注意: 要访问WiFi状态,我们必须在AndroidManifest.xml文件中添加以下权限:

android.permission.ACCESS_WIFI_STATE
android.permission.UPDATE_DEVICE_STATS 
android.permission.CHANGE_WIFI_STATE

5
仅需使用CHANGE_WIFI_STATE权限,在Android 4.2及以上版本中已足够。 - voghDev
2
UPDATE_DEVICE_STATS 仅适用于系统应用程序。 - marienke
5
从安卓 Q 版本开始,你将无法直接打开或关闭 Wi-Fi。 - Ravindra Kushwaha

12

完整的解决方案:

try {
    WifiManager wifi = (WifiManager) 
        context.getSystemService(Context.WIFI_SERVICE);

    WifiConfiguration wc = new WifiConfiguration();
    wc.SSID = "\"SSIDName\"";
    wc.preSharedKey  = "\"password\"";
    wc.hiddenSSID = true;
    wc.status = WifiConfiguration.Status.ENABLED; 

    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);

    wc.allowedPairwiseCiphers
        .set(WifiConfiguration.PairwiseCipher.TKIP);
    wc.allowedPairwiseCiphers
        .set(WifiConfiguration.PairwiseCipher.CCMP);
    wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);

    boolean b=wifi.isWifiEnabled();
    if (b) {
        wifi.setWifiEnabled(false);
        Toast.makeText(context, "yes", Toast.LENGTH_SHORT).show();
    } else {
        wifi.setWifiEnabled(true);
        Toast.makeText(context, "no", Toast.LENGTH_SHORT).show();
    }
    //Log.d("WifiPreference", "enableNetwork returned " + b );

} catch (Exception e) {
    e.printStackTrace();
}

参考资料: http://amitkumar-android.blogspot.com/p/installation-steps.html


1
缺少设置WiFi管理器与WiFi配置的调用:wifi.addNetwork(wc); - Error 454
4
为什么要硬编码你的SSID和密码?这不是个好主意。请谨慎考虑。 - lifeson106
@lifeson106 我认为这只是为了演示的目的。 - Bertram Gilfoyle

10

Android Q(Android 10)中,您无法再以程序方式启用/禁用wifi。请使用设置面板来切换wifi连接:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    // can also use `Settings.Panel.ACTION_WIFI` to enable/disable only WiFi
    val panelIntent = Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY)
    startActivityForResult(panelIntent, 0)
} else {
    // use previous solution, add appropriate permissions to AndroidManifest file (see answers above)
    (this.context?.getSystemService(Context.WIFI_SERVICE) as? WifiManager)?.apply { isWifiEnabled = true /*or false*/ }
}

1
Settings.Panel 官方文档 - M Imam Pratama

4
为了启用或禁用Wifi,使用WifiManager类获取系统(Android设备)的Wifi服务:
WifiManager wifi =(WifiManager)getSystemService(Context.WIFI_SERVICE); 

现在使用WifiManager类的对象wifi来获取wifi状态:

if(wifi.isWifiEnabled())
    //Perform Operation
else
    //Other Operation

最重要的是不要忘记在您的Android清单文件中授予以下权限:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

要获取有关在Android上启用/禁用Wifi的详细信息和完整示例代码,请访问我的网站链接

3

这种方法现在已经被废弃了,从Android Q开始。

尝试使用这个会非常有帮助。

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {// if build version is less than Q try the old traditional method
                    if (!wifiManager.isWifiEnabled()) {
                        wifiManager.setWifiEnabled(true);
                        btnOnOff.setText("Wifi ONN");
                    } else {
                        wifiManager.setWifiEnabled(false);
                        btnOnOff.setText("Wifi OFF");
                    }
                } else {// if it is Android Q and above go for the newer way    NOTE: You can also use this code for less than android Q also
                    Intent panelIntent = new Intent(Settings.Panel.ACTION_WIFI);
                    startActivityForResult(panelIntent, 1);
                }

值得指出新的/首选方法并举例吗? - user1016765

1

我无法直接访问上下文对象。
我的解决方案如下:

Context appContext = Android.App.Application.Context;
var wifiManager = (WifiManager)appContext.GetSystemService(WifiService);
wifiManager.SetWifiEnabled(state);

我不得不更改一些写作,例如WIFI_SERVICE和WifiService。


1
将此权限添加到您的清单中,然后使用上面的代码更改 WiFi 状态:
 <!--permission ge enable and disable WIFI in android-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

1

从Android 10(Q)开始,无法启用/禁用wifi,您需要打开设置意图。

// for android Q and above
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            Intent panelIntent = new 
Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY);
            startActivityForResult(panelIntent, 0);
        } else {
            // for previous android version
            WifiManager wifiManager = (WifiManager) 
this.getApplicationContext().getSystemService(WIFI_SERVICE);
            wifiManager.setWifiEnabled(true);
        }

在清单中,
 <uses-permission
    android:name="android.permission.CHANGE_WIFI_STATE"
    android:required="true" />

1

在 Android 10 之前的设备上,可以使用以下代码启用/禁用 wifi:

WifiManager wifiManager = 
(WifiManager)this.context.getSystemService(Context.WIFI_SERVICE);

wifiManager.setWifiEnabled(status);

但请注意,在Android 10上,以及未来可能也无法再这样做了。
https://issuetracker.google.com/issues/141011684

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