chimaira
chimaira

Reputation: 181

Android 6 : Connect to specific wifi network programmatically not working

I am trying to connect to a wifi network by giving the SSID and pass using WifiManager configurations.

Based on this threads solution: How do I connect to a specific Wi-Fi network in Android programmatically?

The reconnect method is called. but nothing happens (not connected).

Is the Android version (6.0.1) for something? If yes then how to perform a network connection programmatically on Android 6?

Upvotes: 5

Views: 20353

Answers (7)

Singam
Singam

Reputation: 1655

A few things have change to connect to a WiFi network in android Marshmallow. The following code will help you...If you are using Android 6.0 or lowlevel versions...

public void connectToWifi(){
    try{
        WifiManager wifiManager = (WifiManager) super.getSystemService(android.content.Context.WIFI_SERVICE);
        WifiConfiguration wc = new WifiConfiguration();
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        wc.SSID = "\"NETWORK_NAME\"";
        wc.preSharedKey = "\"PASSWORD\"";
        wc.status = WifiConfiguration.Status.ENABLED;
        wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
        wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
        
        wifiManager.setWifiEnabled(true);
        int netId = wifiManager.addNetwork(wc);
        if (netId == -1) {
            netId = getExistingNetworkId(wc.SSID);
        }
        wifiManager.disconnect();
        wifiManager.enableNetwork(netId, true);
        wifiManager.reconnect();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
private int getExistingNetworkId(String SSID) {
    WifiManager wifiManager = (WifiManager) super.getSystemService(Context.WIFI_SERVICE);
    List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks();
    if (configuredNetworks != null) {
        for (WifiConfiguration existingConfig : configuredNetworks) {
            if (existingConfig.SSID.equals(SSID)) {
                return existingConfig.networkId;
            }
        }
    }
    return -1;
}

And add permissions in the Manifest file

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

Upvotes: 12

Rana Umer
Rana Umer

Reputation: 581

This is correct way to connect the wifi and this very short no boilerplate code

 fun connectToWifi(ssid: String, password: String) {
    val connManager = context!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
    val wifiConfiguration = WifiConfiguration()
    wifiConfiguration.SSID = String.format("\"%s\"", ssid)
    wifiConfiguration.preSharedKey = String.format("\"%s\"", password)
    wifiManager = context!!.getSystemService(Context.WIFI_SERVICE) as WifiManager
    val netId: Int = wifiManager.addNetwork(wifiConfiguration)
    wifiManager.disconnect()
    wifiManager.enableNetwork(netId, true)
    wifiManager.reconnect()
    val config = WifiConfiguration()
    config.SSID == "\"\"" + ssid + "\"\""
    config.preSharedKey == "\"\"" + password + "\"\""
    wifiManager.addNetwork(config)
}

Upvotes: 0

Asghar Musani
Asghar Musani

Reputation: 608

This works for me for a WPA connection. You don't need to add again a network if it is already saved.

private void connectToWifi(final String networkSSID, final String networkPassword) {
    int netID = -1;
    String confSSID = String.format("\"%s\"", networkSSID);
    String confPassword = String.format("\"%s\"", networkPassword);

    netID = getExistingNetworkID(confSSID, netID);
    /*
     * If ssid not found in preconfigured list it will return -1
     * then add new wifi
     */
    if (netID == -1) {

        Log.d(TAG,"New wifi config added");

        WifiConfiguration conf = new WifiConfiguration();
        conf.SSID = confSSID;
        conf.preSharedKey = confPassword;
        netID = wifiManager.addNetwork(conf);

    }
    wifiManager.disconnect();
    wifiManager.enableNetwork(netID, true);
    wifiManager.reconnect();
}

private int getExistingNetworkID (String confSSID, int netID){
    List<WifiConfiguration> wifiConfigurationList = wifiManager.getConfiguredNetworks();
    for (WifiConfiguration item : wifiConfigurationList){
        /*
          Find if the SSID is in the preconfigured list - if found get netID
         */
        if (item.SSID != null && item.SSID.equals(confSSID)){

            Log.d(TAG, "Pre-configured running");
            netID = item.networkId;
            break;
        }
    }
    return netID;
}

Upvotes: 0

pm dubey
pm dubey

Reputation: 1016

Try this and enjoy:

 int res = mWifiManager.addNetwork(wifiConfiguration);
                                        if (res == -1) {
                            // Get existed network id if it is already added to WiFi network
                            res = getExistingNetworkId(wifiConfiguration.SSID);
                            Log.d(TAG, "getExistingNetwrkId: " + res);
                        }

      private int getExistingNetworkId(String SSID) {
            List<WifiConfiguration> configuredNetworks = mWifiManager.getConfiguredNetworks();
            if (configuredNetworks != null) {
                for (WifiConfiguration existingConfig : configuredNetworks) {
                    if (SSID.equalsIgnoreCase(existingConfig.SSID)) {
                        return existingConfig.networkId;
                    }
                }
            }
            return -1;
        }

Upvotes: -1

Shundong Zhou
Shundong Zhou

Reputation: 21

You need to call disconnect() and reconnect() of WiFiManager. This works for me:

                WifiConfiguration conf = new WifiConfiguration();
                conf.hiddenSSID = true;
                conf.priority = 1000;
                conf.SSID = "\"" + SSID + "\"";
                conf.preSharedKey = "\""+Password+"\"";
                conf.status = WifiConfiguration.Status.ENABLED;
                conf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);

                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);

                conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
                conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);

                conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
                conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);

                conf.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
                conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
                int res = wifiManager.addNetwork(conf);
                boolean es = wifiManager.saveConfiguration();
                Log.d(TAG, "saveConfiguration returned " + es );
                wifiManager.disconnect();
                boolean bRet = wifiManager.enableNetwork(res, true);
                Log.i(TAG, "enableNetwork bRet = " + bRet);
                wifiManager.reconnect();

Upvotes: 2

Nishkarsh
Nishkarsh

Reputation: 294

A few things have changed about how you connect to a WiFi network since android Lollipop and Marshmallow. There is a nice blog post related to how you connect to WiFi network on Marshmallow and below versions

http://www.intentfilter.com/2016/08/programatically-connecting-to-wifi.html

The post describes a scenario when WiFi network has no connectivity and you want to send traffic through that network (something like captive portal). But it also explains the complete process and would work for normal networks. You won't find the exact code but it might still help in knowing where you got stuck.

Upvotes: 2

Rishabh Jain
Rishabh Jain

Reputation: 81

Add a wifi configuration using addNetwork and then connect to it using enableNetwork.

    WifiConfiguration wificonfiguration = new WifiConfiguration();
    StringBuffer stringbuffer = new StringBuffer("\"");
    stringbuffer.append((new StringBuilder(String.valueOf(HOTSPOT_NAME))).append("\"").toString());
    wificonfiguration.SSID = stringbuffer.toString();
    wificonfiguration.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
    wificonfiguration.allowedAuthAlgorithms.set(0);
    wificonfiguration.status = 2;
    wificonfiguration.preSharedKey = "\"" + HOTSPOT_PASSWORD + "\"";

    int networkId_ = wifi.addNetwork(wificonfiguration);

    if(networkId>-1){

           boolean status = wifi.enableNetwork(networkId_, true);

    }

For marshmallow: Your apps can now change the state of WifiConfiguration objects only if you created these objects. You are not permitted to modify or delete WifiConfiguration objects created by the user or by other apps. More info on Marshmallow

Upvotes: 3

Related Questions