15

I use the code below to connect to encrypted networks. However if a network is unsecured and I leave key empty ("") then it fails. Has anyone an idea how to solve this? Furthermore is it possible to detect if a network is open using the ssid / bssid ? Or do I have to scan with a filter?

public void connectToSSID(final String ssid, final String key) {
    Log.i("wifimaster", "connection to "+ssid);

    WifiConfiguration wc = new WifiConfiguration();
    wc.SSID = "\""+ssid+"\""; //IMPORTANT! This should be in Quotes!!  
    wc.priority = 40;
    wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
    wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
    wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
    wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
    wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
    wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
    wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
    wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);

    wc.preSharedKey = "\""+key+"\"";
    wc.wepKeys[0] = "\""+key+"\""; //This is the WEP Password
    wc.wepTxKeyIndex = 0;

    wc.preSharedKey = "\""+key+"\"";

    int res = wifiManager.addNetwork(wc);
    Log.d("WifiPreference", "add Network returned " + res );
    boolean es = wifiManager.saveConfiguration();
    Log.d("WifiPreference", "saveConfiguration returned " + es );
    boolean b = wifiManager.enableNetwork(res, true);   
    Log.d("WifiPreference", "enableNetwork returned " + b );

    if(b)
        Toast.makeText(c, c.getString(R.string.connected), Toast.LENGTH_SHORT).show();
    else
        Toast.makeText(c, c.getString(R.string.unconnected), Toast.LENGTH_SHORT).show();
}
paulgavrikov
  • 1,883
  • 3
  • 29
  • 51

1 Answers1

14

Use

wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);

only and it will work.

remove all other assignments to wc, it is not necessary to use them for a simple task of connecting to a network. You are not creating a network, you are connecting to an existing one.

For full solution check this link: How do I connect to a specific Wi-Fi network in Android programmatically? It has everything you need to know.

Community
  • 1
  • 1
Vikram Gupta
  • 6,496
  • 5
  • 34
  • 47
  • Do you have any code on how to get the encryption method from *only* the ssid? – paulgavrikov Oct 20 '12 at 18:00
  • 2
    No. You cannot find the encryption method from only the ssid. You must scan for networks then use ScanResult to get all available networks. Then search for your network with the given ssid and find its encryption method. Here is a link: http://stackoverflow.com/a/12747455/1117338 and http://developer.android.com/reference/android/net/wifi/ScanResult.html#capabilities – Vikram Gupta Oct 22 '12 at 11:23