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

标签 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();
}

其他信息:

在 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/

相关文章:

java - WiFi getSSID() 总是返回 "<unknown ssid>"

android - 获取设备的 MAC 地址 - 当 wifi 关闭时

android - 连接到指定的可用 wifi 网络

android - 如何在 flutter 中为底部导航栏图标提供渐变

Android:setSelection 对 Spinner 没有影响

header - 802.11 header 中是否有 ethertype 字段

Android - 检测到新接入点时收到通知?

android - 应用内计费,如何在服务器上实现 Security.java? (应用引擎?)

android - Android 中没有图库的全屏 ImageSwitcher

android - Wi-Fi直连技术