WifiConfiguration enable network in Lollipop

I was working on Wifi project, there is a module that enable user to join wifi programatically.

In kitkat and below it’s working successfully, but in Lollipop it’s not working.

  • BLE obtain uuid encoded in advertising packet
  • How to read barcodes with the camera on Android?
  • Android scrollview not filling parent view
  • Custom screen dim with Dialog
  • ionic build android failure - Execution failed for task processDebugResources
  • ImageView one dimension to fit free space and second evaluate to keep aspect ration
  • Here is the code :

    WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    WifiConfiguration wifiConfiguration = new WifiConfiguration();
    wifiConfiguration.SSID = "\"testSSID\"";
    wifiConfiguration.hiddenSSID = true;
    wifiConfiguration.status = WifiConfiguration.Status.ENABLED;
    wifiConfiguration.allowedKeyManagement
    .set(WifiConfiguration.KeyMgmt.NONE);
    netId = wifiManager.addNetwork(wifiConfiguration);
    Log.d("WifiPreference", "add Network returned " + netId);
    boolean checkEnableWifi = wifiManager.enableNetwork(netId, true);
    Log.d("WifiPreference", "enableNetwork returned " + checkEnableWifi);
    

    my tested device is nexus 5 build number LRX21O, is ther something wrong in my code or bug on Lollipop?

  • Android implementation of lifecycle methods can call the superclass implementation after doing any work?
  • Centering bitmap Marker (Google Maps Android API v2)
  • android - go to settings screen
  • Phonegap app crashes when switched orientation even with AndroidManifest changes
  • Android Fragments should I reuse 1 fragment or create new instances?
  • DrawerLayout's item click - When is the right time to replace fragment?
  • 5 Solutions collect form web for “WifiConfiguration enable network in Lollipop”

    Faced similar issue on lollipop.

    Disabling other networks manually, an then reconnecting wifi manager solved the issue.

    boolean enableNework(String ssid, Context cxt) {
        boolean state = false;
        WifiManager wm = (WifiManager) cxt.getSystemService(Context.WIFI_SERVICE);
        if (wm.setWifiEnabled(true)) {
            List<WifiConfiguration> networks = wm.getConfiguredNetworks();
            Iterator<WifiConfiguration> iterator = networks.iterator();
            while (iterator.hasNext()) {
                WifiConfiguration wifiConfig = iterator.next();
                if (wifiConfig.SSID.equals(ssid))
                    state = wm.enableNetwork(wifiConfig.networkId, true);
                else
                    wm.disableNetwork(wifiConfig.networkId);
            }
            wm.reconnect();
        }
        return state;
    }
    

    Try this. Do not disable other saved networks. As it will hinder the fallback of wifi on other networks when your selected network is not available. Play with the priority.

    /*
     *  Max priority of network to be associated.
     */
    private static final int MAX_PRIORITY = 999999;
    
    /**
     * Allow a previously configured network to be associated with.
     */
    public boolean enableNetwork(String ssid) {
        boolean state = false;
        List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
    
        if(list != null && list.size() > 0) {
            for( WifiConfiguration i : list ) {
                if(i.SSID != null && i.SSID.equals(convertToQuotedString(ssid))) {
    
                    wifiManager.disconnect();
    
                    int newPri = getMaxPriority() + 1;
                    if(newPri >= MAX_PRIORITY) {
                        // We have reached a rare situation.
                        newPri = shiftPriorityAndSave();
                    }
    
                    i.priority = newPri;
                    wifiManager.updateNetwork(i);
                    wifiManager.saveConfiguration();
    
                    state = wifiManager.enableNetwork(i.networkId, true);
                    wifiManager.reconnect();
                    break;
                }
            }
        }
    
        return state;
    }
    
    private int getMaxPriority() {
        final List<WifiConfiguration> configurations = wifiManager.getConfiguredNetworks();
        int pri = 0;
        for (final WifiConfiguration config : configurations) {
            if (config.priority > pri) {
                pri = config.priority;
            }
        }
        return pri;
    }
    
    private void sortByPriority(final List<WifiConfiguration> configurations) {
        Collections.sort(configurations,
            new Comparator<WifiConfiguration>() {
                @Override
                public int compare(WifiConfiguration object1, WifiConfiguration object2) {
                    return object1.priority - object2.priority;
                }
            });
    }
    
    private int shiftPriorityAndSave() {
        final List<WifiConfiguration> configurations = wifiManager.getConfiguredNetworks();
        sortByPriority(configurations);
        final int size = configurations.size();
        for (int i = 0; i < size; i++) {
            final WifiConfiguration config = configurations.get(i);
            config.priority = i;
            wifiManager.updateNetwork(config);
        }
        wifiManager.saveConfiguration();
        return size;
    }
    
    /**
     * Add quotes to string if not already present.
     *
     * @param string
     * @return
     */
    public static String convertToQuotedString(String string) {
        if (TextUtils.isEmpty(string)) {
            return "";
        }
    
        final int lastPos = string.length() - 1;
        if (lastPos > 0
                && (string.charAt(0) == '"' && string.charAt(lastPos) == '"')) {
            return string;
        }
    
        return "\"" + string + "\"";
    }
    

    Try adding wifiManager.setWifiEnabled(true); at the end of your code.

    try setting false where you are trying to diable other networks.

    wifiManager.enableNetwork(netId, false);
    

    and one more thing if your addNetwork succeeds then you can proceed with the rest. if it returns a -1 you cannot call enableNetwork as the netId you are using would be -1. so what you could ideally do is

    netId = wifiManager.addNetwork(wifiConfiguration);
    if(netId >= 0){
    Log.d("WifiPreference", "add Network returned " + netId);
    boolean checkEnableWifi = wifiManager.enableNetwork(netId, true);
    Log.d("WifiPreference", "enableNetwork returned " + checkEnableWifi);
    }
    

    I was facing a situation on Nexus 7 connecting to hp printer in which the method enablenetwork(id,true) return true but still does not connect. Answer from @Santosh and @Seraphim helped me..Disabling each network and enabling only the required SSID worked.

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.