前提:
我目前正在使用Android应用程序(API级别23,Android 6.0),该应用程序通过Wi-Fi与设备连接并使用UDP数据包进行通信。我可以使用特定命令更改设备的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();
}
其他信息:
在清单文件中,我声明了以下权限:
<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)
返回假(我不知道为什么会失败)
mWifiManager.disableNetwork(netId);
返回true,但似乎没有效果
如果我使用Android设置更改密码,则一切正常...但是我想以编程方式更改保存的密码。
非常感谢您的帮助
答案 0 :(得分:0)
经过几次尝试,按照下面的说明,我目前没有任何问题。
在连接到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();
}
答案 1 :(得分:0)
版本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();
}