Como e o que definir para Android WifiConfiguration.preSharedKey para se ligar à rede WPA2 PSK Wi-Fi

Em Android 1.5 (também em 1.6)

Como adicionar um ponto de acesso a partir do Código?

Dado o ponto de acesso que suporta o WPA2. Aqui está o meu excerto de código.

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 );

este código falha como no LogCat appear

01-26 16:44:13.550: ERROR/wpa_ Supplicant (2032): linha 0: senha inválida do PSK.

Tenho a certeza que esta é a senha e que todos os outros parâmetros estão certos. O que é que eu sinto falta?

Author: Boris Daich, 2010-01-26

3 answers

A razão da minha tristeza está aqui nesta edição de documentação.

Enquanto a documentação aqui diz

" chave pré-partilhada para utilização com o WPA-PSK. Quando o valor desta chave é lido, a chave real não é devolvida, apenas um "*"se a chave tem um valor, ou a string nula caso contrário."

Está correcto, mas muito importante o que não diz é que se espera aqui um resultado de hash de 64 bytes do linux. comando

wpa_passphrase <ssid> [passphrase] 

Ou a senha do ponto de acesso entre aspas!

Então, no caso de a PSK do ponto de Acesso ser "exemplo" tem que ser passado em java assim.
WifiConfiguration myWiFiConfig = new WifiConfiguration();
...
myWiFiConfig.preSharedKey = "\"example\"";
...

Ou

myWiFiConfig.preSharedKey = "0a0b0f62170ecc5bcf721b6ff170b8b560101b5d56b00a26abec217e0bb4aa1f";

Pois todo o resto de vós que tropeçarem nisto, o caminho certo é:

Copie e cole-o como está e salve o seu eu meio dia de dor que já gastamos nele (graças especial a 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 );
 44
Author: Boris Daich, 2017-05-23 12:17:08
Obrigado a tudo o que puder usar o teu código na minha WPA psk Wi-Fi.
   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 );

Mais cedo, introduzo a senha do erro, mas depois corrijo a senha e depois funciona.

 4
Author: poe, 2012-12-14 09:18:07

Terá de adicionar uma linha abaixo para:

wifi.saveConfiguration();
 3
Author: sl96314, 2012-04-01 09:04:12