void changeWifiConfiguration(boolean dhcp, String ip, int prefix, String dns1, String gateway) { WifiManager wm = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); if(!wm.isWifiEnabled()) { // wifi is disabled return; } // get the current wifi configuration WifiConfiguration wifiConf = null; WifiInfo connectionInfo = wm.getConnectionInfo(); List<WifiConfiguration> configuredNetworks = wm.getConfiguredNetworks(); if(configuredNetworks != null) { for (WifiConfiguration conf : configuredNetworks){ if (conf.networkId == connectionInfo.getNetworkId()){ wifiConf = conf; break; } } } if(wifiConf == null) { // wifi is not connected return; } try { Class<?> ipAssignment = wifiConf.getClass().getMethod("getIpAssignment").invoke(wifiConf).getClass(); Object staticConf = wifiConf.getClass().getMethod("getStaticIpConfiguration").invoke(wifiConf); if(dhcp) { wifiConf.getClass().getMethod("setIpAssignment", ipAssignment).invoke(wifiConf, Enum.valueOf((Class<Enum>) ipAssignment, "DHCP")); if(staticConf != null) { staticConf.getClass().getMethod("clear").invoke(staticConf); } } else { wifiConf.getClass().getMethod("setIpAssignment", ipAssignment).invoke(wifiConf, Enum.valueOf((Class<Enum>) ipAssignment, "STATIC")); if(staticConf == null) { Class<?> staticConfigClass = Class.forName("android.net.StaticIpConfiguration"); staticConf = staticConfigClass.newInstance(); } // STATIC IP AND MASK PREFIX Constructor<?> laConstructor = LinkAddress.class.getConstructor(InetAddress.class, int.class); LinkAddress linkAddress = (LinkAddress) laConstructor.newInstance( InetAddress.getByName(ip), prefix); staticConf.getClass().getField("ipAddress").set(staticConf, linkAddress); // GATEWAY staticConf.getClass().getField("gateway").set(staticConf, InetAddress.getByName(gateway)); // DNS List<InetAddress> dnsServers = (List<InetAddress>) staticConf.getClass().getField("dnsServers").get(staticConf); dnsServers.clear(); dnsServers.add(InetAddress.getByName(dns1)); dnsServers.add(InetAddress.getByName("8.8.8.8")); // Google DNS as DNS2 for safety // apply the new static configuration wifiConf.getClass().getMethod("setStaticIpConfiguration", staticConf.getClass()).invoke(wifiConf, staticConf); } // apply the configuration change boolean result = wm.updateNetwork(wifiConf) != -1; //apply the setting if(result) result = wm.saveConfiguration(); //Save it if(result) wm.reassociate(); // reconnect with the new static IP } catch(Exception e) { e.printStackTrace(); } }
changeWifiConfiguration(false,"192.168.3.5",24,"255.255.255.0","192.168.3.1");