如何设置Android WifiConfiguration.preSharedKey以连接WPA2 PSK WiFi网络?

19
在Android 1.5(也适用于1.6版本)中,
如何通过代码添加接入点?
假设已有支持WPA2的接入点, 这是我的代码片段。
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiConfiguration wc = new WifiConfiguration();
// This is must be quoted according to the documentation 
// http://developer.android.com/reference/android/net/wifi/WifiConfiguration.html#SSID
wc.SSID = "\"SSIDName\"";
wc.preSharedKey  = "password";
wc.hiddenSSID = true;
wc.status = WifiConfiguration.Status.ENABLED;        
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
int res = wifi.addNetwork(wc);
Log.d("WifiPreference", "add Network returned " + res );
boolean b = wifi.enableNetwork(res, true);        
Log.d("WifiPreference", "enableNetwork returned " + b );

此代码无法正常运行,因为LogCat中出现以下错误信息:

01-26 16:44:13.550: ERROR/wpa_supplicant(2032): Line 0: Invalid PSK 'password'.

我确定这是密码,并且其余所有参数都正确。 我错过了什么?

3个回答

47

我悲伤的原因在这里:这个文档问题

这里的文档则声明:

"用于WPA-PSK的预共享密钥。当读取此密钥的值时,实际密钥不会返回,而只是一个“*”,如果密钥有值,则返回空字符串。"

这是正确的,但非常重要的是,它没有说期望此处为Linux命令的64字节哈希结果。

wpa_passphrase <ssid> [passphrase] 

或者接入点的密码用双引号括起来!

所以,如果接入点的PSK是"example",在Java中必须这样传递:

WifiConfiguration myWiFiConfig = new WifiConfiguration();
...
myWiFiConfig.preSharedKey = "\"example\"";
...

或者

myWiFiConfig.preSharedKey = "0a0b0f62170ecc5bcf721b6ff170b8b560101b5d56b00a26abec217e0bb4aa1f";

对于所有可能遇到这个问题的人,正确的方法是:

直接复制粘贴,不要改动任何内容,这样可以避免浪费时间(特别感谢Reflog)。

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiConfiguration wc = new WifiConfiguration();
wc.SSID = "\"SSIDName\"";
wc.preSharedKey  = "\"password\"";
wc.hiddenSSID = true;
wc.status = WifiConfiguration.Status.ENABLED;        
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
int res = wifi.addNetwork(wc);
Log.d("WifiPreference", "add Network returned " + res );
boolean b = wifi.enableNetwork(res, true);        
Log.d("WifiPreference", "enableNetwork returned " + b );

1
嗨,我正在使用相同的代码来创建wifi配置并连接到新创建的wifi接入点。但是当我一旦连接到wifi网络,然后重新启动设备时,我的wifi配置就不会被安卓系统记住了。你知道我们可以告诉安卓系统,让它在运行期间记住这个wifi配置的方法吗? - User7723337
我尝试了相同的代码,但无法连接。当我查看WiFi设置时,我发现对于该特定接入点,状态显示为“记住使用WPA / WPA2 PSK保护的安全连接”。当我尝试手动连接时,它不会要求密码,但无法连接。请帮忙。 - png
1
@A_user 将以下内容添加到末尾:wifi.saveConfiguration(); - Jeremy Logan
自API 26起,无需调用saveConfiguration(),因为addNetwork()会自动更新配置。 - Oke Uwechue

6
感谢您,我可以使用您的代码连接到我的WPA PSK WiFi。
   WifiConfiguration wc = new WifiConfiguration();
    // This is must be quoted according to the documentation 
    // http://developer.android.com/reference/android/net/wifi/WifiConfiguration.html#SSID
    wc.SSID = "\"zpoint\"";
    wc.preSharedKey  = "\"sipisP@ssw0rd!\"";
    wc.hiddenSSID = true;
    wc.status = WifiConfiguration.Status.ENABLED;        
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
    wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
    int res = wifi.addNetwork(wc);
    Log.d("WifiPreference", "add Network returned " + res );
    boolean b = wifi.enableNetwork(res, true);        
    Log.d("WifiPreference", "enableNetwork returned " + b );

之前我输入了错误的密码,但后来我更正了密码,然后它就可以使用了。


3

为了达成以下目的,您需要添加下面的代码行:

wifi.saveConfiguration();

自 API 26 起,无需调用该方法;调用 addNetwork() 方法会自动更新配置。 - Oke Uwechue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接