前提:
我目前正在开发一个 Android 应用程序(API 级别 23,Android 6.0),该应用程序通过 Wi-Fi 与设备连接并使用 UDP 数据包进行通信。我可以使用特定命令更改设备 Wi-Fi 密码。这工作得很好。
目标:
我尝试以编程方式执行的操作是:
- 搜索设备生成的 Wi-Fi
- 连接到设备
- 发送更改密码的命令
- 使用新密码重新连接到设备
我能够使用如下代码首次连接(步骤 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();
}
其他信息:
在 list 文件中我声明了这些权限:
<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,但似乎没有任何效果
如果我使用 Android 设置来更改密码,一切正常...但我想以编程方式更改保存的密码。
非常感谢任何帮助
最佳答案
经过多次尝试,目前我按照下面报告的说明操作没有任何问题。
在连接到 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();
}
关于android - 如何以编程方式更改 Android 中保存的 wifi 网络的密码(API 级别 23,Android 6.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52726315/