user1758835
user1758835

Reputation: 215

How to connect android device to "WPA2 PSK" secured wifi hotspot network programmatically?

In my Android app I'm trying to connect my Android device to "WPA2-PSK" secured connection and after lot of search I have written following code--

if (securityMode.equalsIgnoreCase("WPA2")) // WPA2
                {

                   wifiConfiguration.SSID = "\"" + networkSSID + "\"";
                    wifiConfiguration.preSharedKey = "\"" + networkPass + "\"";
                    wifiConfiguration.status = WifiConfiguration.Status.ENABLED;
                    wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
                    wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
                    wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
                    wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
                    wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
                    wifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
                    wifiManager.setWifiEnabled(true);
                    wifiManager.saveConfiguration();
                    int added = wifiManager.addNetwork(wifiConfiguration);
                    System.out.println("added network: " + added);
                    boolean enabled = wifiManager.enableNetwork(added, true);
                    System.out.println("enableNetwork returned: " + enabled);                   

                }

Above code is executing fine (without any error) but don't know why, connection is not getting establish. Please help. Thank you.!

Upvotes: 5

Views: 10340

Answers (1)

KOTIOS
KOTIOS

Reputation: 11194

Below id clear api for all type of wifi security-type :

  public void addWifiConfig(String ssid,String password,String securityParam,String securityDetailParam) {
    Log.d(TAG, "Inside addWifiConfig...");
    if (ssid == null) {
        throw new IllegalArgumentException(
                "Required parameters can not be NULL #");
    }

    String wifiName = ssid;
    WifiConfiguration conf = new WifiConfiguration();
    // On devices with version Kitkat and below, We need to send SSID name
    // with double quotes. On devices with version Lollipop, We need to send
    // SSID name without double quotes
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        conf.SSID = wifiName;
    } else {
        conf.SSID = Constants.BACKSLASH + wifiName + Constants.BACKSLASH;
    }
    String security = securityParam;
    Log.d(TAG, "Security Type :: " + security);
    if (security.equalsIgnoreCase("WEP")) {
        conf.wepKeys[0] = password;
        conf.wepTxKeyIndex = 0;
        conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
        conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
    } else if (security
            .equalsIgnoreCase("NONE")) {
        conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
    } else if ("WPA"
            .equalsIgnoreCase(security)
            || "WPA2"
                    .equalsIgnoreCase(security)
            || "WPA/WPA2 PSK"
                    .equalsIgnoreCase(security)) {
        // appropriate ciper is need to set according to security type used,
        // ifcase of not added it will not be able to connect
        conf.preSharedKey = Constants.BACKSLASH
                + password + Constants.BACKSLASH;
        conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
        conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
        conf.status = WifiConfiguration.Status.ENABLED;
        conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
        conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
        conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
        conf.allowedPairwiseCiphers
                .set(WifiConfiguration.PairwiseCipher.TKIP);
        conf.allowedPairwiseCiphers
                .set(WifiConfiguration.PairwiseCipher.CCMP);
        conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
        conf.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
    }
    String securityDetails = securityDetailParam;
    if (securityDetails
            .equalsIgnoreCase(Constants.NETWROK_ADDITIONAL_SECURITY_TKIP)) {
        conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
        conf.allowedPairwiseCiphers
                .set(WifiConfiguration.PairwiseCipher.TKIP);
    } else if (securityDetails
            .equalsIgnoreCase(Constants.NETWROK_ADDITIONAL_SECURITY_AES)) {
        conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
        conf.allowedPairwiseCiphers
                .set(WifiConfiguration.PairwiseCipher.CCMP);
    } else if (securityDetails
            .equalsIgnoreCase(Constants.NETWROK_ADDITIONAL_SECURITY_WEP)) {
        conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
        conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
    } else if (securityDetails
            .equalsIgnoreCase(Constants.NETWROK_ADDITIONAL_SECURITY_NONE)) {
        conf.allowedPairwiseCiphers
                .set(WifiConfiguration.PairwiseCipher.NONE);
    }
    WifiManager wifiManager = (WifiManager) mContext
            .getSystemService(Context.WIFI_SERVICE);

    int newNetworkId = wifiManager.addNetwork(conf);
        wifiManager.enableNetwork(newNetworkId, true);
        wifiManager.saveConfiguration();
        wifiManager.setWifiEnabled(true);
}

This is working example

Upvotes: 8

Related Questions