如何以编程方式更改Android中保存的wifi网络的密码(API级别23,Android 6.0)



前提:

我目前正在开发一个Android应用程序(API级别23,Android 6.0(,该应用程序通过Wi-Fi与设备连接并使用UDP数据包进行通信。我可以使用特定命令更改设备 Wi-Fi 密码。这工作正常。

目标:

我想以编程方式做的是:

  1. 搜索从设备生成的 Wi-Fi
  2. 连接到设备
  3. 发送命令以更改密码
  4. 使用新密码重新连接到设备

我能够使用如下代码第一次连接(步骤 1,2,3(:

private void connect(String ssid, String password) {
WifiConfiguration conf = new WifiConfiguration();
conf.SSID = String.format(""%s"", ssid);
conf.preSharedKey = String.format(""%s"", password);
netId = mWifiManager.addNetwork(conf);
mWifiManager.saveConfiguration();
mWifiManager.disconnect();
mWifiManager.enableNetwork(netId, true);
mWifiManager.reconnect();
}

附加信息:

在清单文件中,我声明了以下权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

问题:

如果我在更改密码后尝试使用相同的方法进行连接,则无法实现连接,因为(我认为(Android会记住以前的密码。

如果我尝试使用updateNetwork(conf)而不是addNetwork(conf),我没有注意到任何区别。

在尝试再次连接之前,我曾尝试以某种方式删除或禁用保存的网络,但无法连接。

mWifiManager.removeNetwork(netId)

返回 false(我不知道为什么它会失败(

mWifiManager.disableNetwork(netId);

返回 true,但似乎没有效果

如果我使用安卓设置更改密码,一切正常...但我想以编程方式更改保存的密码。

任何帮助都非常感谢

经过几次尝试,我目前按照下面报告的说明没有问题。

在连接到Wi-Fi网络之前,请务必检查以前保存的网络列表。如果没有具有相同SSID的网络,则可以创建新配置,否则需要修改现有配置。

public void connect(String ssid, String password) {
WifiConfiguration wifiConf = null;
WifiConfiguration savedConf = null;
//existing configured networks
List<WifiConfiguration> list = mWifiManager.getConfiguredNetworks();
if(list!=null) {
for( WifiConfiguration i : list ) {
if (i.SSID != null && i.SSID.equals(""" + ssid + """)) {
Log.d(TAG, "existing network found: " + i.networkId + " " + i.SSID);
savedConf = i;
break;
}
}
}
if(savedConf!=null) {
Log.d(TAG, "coping existing configuration");
wifiConf = savedConf;
} else {
Log.d(TAG, "creating new configuration");
wifiConf = new WifiConfiguration();
}
wifiConf.SSID = String.format(""%s"", ssid);
wifiConf.preSharedKey = String.format(""%s"", password);
int netId;
if(savedConf!=null) {
netId = mWifiManager.updateNetwork(wifiConf);
Log.d(TAG, "configuration updated " + netId);
} else {
netId = mWifiManager.addNetwork(wifiConf);
Log.d(TAG, "configuration created " + netId);
}
mWifiManager.saveConfiguration();
mWifiManager.disconnect();
mWifiManager.enableNetwork(netId, true);
mWifiManager.reconnect();
}

版本6之后的Android不允许任何应用程序修改Wi-Fi网络,除非它是由应用程序本身创建的。此外,它不允许添加与之前已配置的其他网络同名的 Wi-Fi 网络。这很奇怪,因为当您从设置中手动配置 Wi-Fi 网络时,它确实允许它。 在考虑了很长时间的可能解决方案后,我想到也许可以使用另一个名称添加 Wifi 网络,一旦添加,请将其更改为所需的名称。我已经尝试过了,它有效。它将如下所示:

int networkId = -1;
// Find my Wifi
List<WifiConfiguration> configuredWifis = wifiManager.getConfiguredNetworks();
for(WifiConfiguration wifi : configuredWifis)
{
if(wifi.SSID != null && wifi.SSID.equals(""" + WIFI_SSID + """) && wifi.priority == WIFI_PRIORITY)
{
networkId = wifi.networkId;
}
else
{
wifiManager.disableNetwork(wifi.networkId);
wifiManager.removeNetwork(wifi.networkId); // After android 6 it really does not remove the Wifi network
wifiManager.saveConfiguration();
}
}

if(networkId == -1)
{
// If my Wifi is not yet configured then add it
WifiConfiguration conf = new WifiConfiguration();
conf.SSID = """ + WIFI_SSID + """;
conf.preSharedKey = """+ WIFI_PASSW +""";
conf.priority = WIFI_PRIORITY;
networkId = wifiManager.addNetwork(conf);
if(networkId == -1) // This ocurs when a wifi with the same name is yet configured. After Android 6 is not possible modify it.
{
Random random = new Random(System.currentTimeMillis());
int randomInteger = random.nextInt(10000);
conf.SSID = """ + WIFI_SSID + randomInteger + """;
networkId = wifiManager.addNetwork(conf); // Add my wifi with another name
conf.SSID = """ + WIFI_SSID + """;
conf.networkId = networkId;
networkId = wifiManager.updateNetwork(conf); // After my wifi is added with another name, I change it to the desired name
}
}
// Connect to my wifi
if(wifiManager.getConnectionInfo().getNetworkId() != networkId)
{
wifiManager.disconnect();
wifiManager.enableNetwork(networkId, true);
wifiManager.reconnect();
}

相关内容

最新更新