I am writing an android app which will connect to a specific WPA access point, when connected, it will issue a http call. It will not save the network config. I have read almost every post on stack overflow on connecting to wifi network but can't find the answer which works for me. Here is the code I am using to connect..
WifiConfiguration wc = new WifiConfiguration();
wc.allowedAuthAlgorithms.clear();
wc.allowedGroupCiphers.clear();
wc.allowedPairwiseCiphers.clear();
wc.allowedProtocols.clear();
wc.allowedKeyManagement.clear();
wc.SSID = "\"".concat("<ssid>").concat("\"");
wc.preSharedKey = "\"".concat("<password>").concat("\"");
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); // For WPA2
wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); // For WPA
wc.priority = 0;
//wc.hiddenSSID = true;
wc.status = WifiConfiguration.Status.ENABLED;
// connect to and enable the connection
WifiManager wifiManager = (WifiManager) getSystemService(this.WIFI_SERVICE);
int netId = wifiManager.addNetwork(wc);
boolean wifiEnabled = wifiManager.enableNetwork(netId, true);
wifiManager.setWifiEnabled(true);
Log.d("opener", "addNetwork returned " + netId);
if (netId > 0) {
wifiId = netId;
}
However netId is always -1. I have tried it on two different phones (ICS:HTC Rezound and GingerBread:Motorola DroidX). Both show exactly same results. What am I doing wrong?
Edit: I tried same code with WPA2 access point and got very weird results. When this code was run, first time it would return -1, but if I call same method second time with a delay of 1 second, it would return valid netId. So the questions are
- why does above code not connect to wpa ?
- in wpa2, why do I need to call above method twice to get connected ? Edit: I observed that I had to connect multiple times to get connected. Sometimes it would take 3-4 times to connect. So for now I am looping until adding config returns >0 id.
The problem is that you're trying to add the network configuration that already exists. When you call:
it will fail (return -1) if the network configuration with the same SSID already exists. So, what you need to do is to check if netId is -1 and if it is, traverse through the configured networks searching for the network with same SSID and once it's found, return the networkId.
Kotlin:
I had the same problem. I found out that your wifi must be on while you are calling addNetwork.
I have found that if the shared key is less than 8 characters, it will return -1.
I just had this very same problem. Seemingly everything was okay, but then - it wasn't.
What I found is this:
Android WifiStateMachine will not allow you to add or modify networks unless supplicant is running and connected-to. This affects services running on start-up and services running even if WIFI is off.
Android WifiConfigStore tracks owners of the wifi network by UID. It means that you may not be able to modify network created by another process.
The proper way to add a network is:
WifiManager.setWifiEnabled(true)
.WifiManager.pingSupplicant()
returns true.WifiConfiguration
, then pass it toWifiManager.addNetwork()
. Make sure the value returned is not (-1).addNetwork()
as an argument toWifiConfiguration.enableNetwork()
call (unless it's -1). Note, that the boolean parameter meansdisableOthers
and should be false, unless you have right to modify all other networks: it may fail internally, if you set it to true.This should allow you to add (and connect) programmatically to a new Wifi network.
Possibly a bit late but try this to connect to Open/WPA/WPA2/WEP secured networks
Obviously set your own variables for the different security types as applicable. The key (pardon the pun) to connecting to a WEP secured network is the getHexKey method as below.