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

时间:2018-10-09 17:22:40

标签: android wifi wifimanager

前提:

我目前正在使用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)

返回假(我不知道为什么会失败)

mWifiManager.disableNetwork(netId);

返回true,但似乎没有效果

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

非常感谢您的帮助

2 个答案:

答案 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();
}