Skip to main content
 首页 » 编程设计

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

2025年12月25日34softidea

前提:

我目前正在开发一个 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(); 
}