想要在代码中实现设置WIFI静态IP需要有系统权限,要在manifest文件添加android:sharedUserId="android.uid.system",还要有系统签名。
设置WIFI静态IP和之前以太网的类似,都是要构造StaticIpConfiguration对象,以及IpConfiguration.IpAssignment.STATIC就代表设置为静态IP,也可以设置DHCP(自动获取),不过WifiConfiguration可以直接通过WifiManager获取到,比设置以太网的要简单一些,不用反射来获取对象。
将IP,NETMASK,GATEWAY和DNS设置进去,构造StaticIpConfiguration对象,下边是代码:
try {
Inet4Address inetAddr = getIPv4Address(STATIC_IP);
int prefixLength = NetUtils.maskStr2InetMask(STATIC_NETMASK);
InetAddress gatewayAddr = getIPv4Address(STATIC_GATEWAY);
InetAddress dnsAddr = getIPv4Address(STATIC_DNS1);
Class[] cl = new Class[]{InetAddress.class, int.class};
Constructor cons = null;
Class<?> clazz = Class.forName("android.net.LinkAddress");
//取得所有构造函数
try {
cons = clazz.getConstructor(cl);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
if (cons == null) {
return;
}
//给传入参数赋初值
Object[] x = {inetAddr, prefixLength};
//构造StaticIpConfiguration对象
Class<?> staticIpConfigurationCls = Class.forName("android.net.StaticIpConfiguration");
//实例化StaticIpConfiguration
Object staticIpConfiguration = null;
staticIpConfiguration = staticIpConfigurationCls.newInstance();
Field ipAddress = staticIpConfigurationCls.getField("ipAddress");
Field gateway = staticIpConfigurationCls.getField("gateway");
Field dnsServers = staticIpConfigurationCls.getField("dnsServers");
//设置ipAddress
ipAddress.set(staticIpConfiguration, (LinkAddress) cons.newInstance(x));
//设置网关
gateway.set(staticIpConfiguration, gatewayAddr);
//设置dns
ArrayList<InetAddress> dnsList = (ArrayList<InetAddress>) dnsServers.get(staticIpConfiguration);
dnsList.add(dnsAddr);
if (!STATIC_DNS2.isEmpty()) {
dnsList.add(getIPv4Address(STATIC_DNS2));
}
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
WifiConfiguration wifiConfig = null;
WifiInfo connectionInfo = wifiManager.getConnectionInfo(); //得到连接的wifi网络
@SuppressLint("MissingPermission")
List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks();
for (WifiConfiguration conf : configuredNetworks) {
if (conf.networkId == connectionInfo.getNetworkId()) {
wifiConfig = conf;
break;
}
}
@SuppressLint("PrivateApi") Class ipAssignmentCls = Class.forName("android.net.IpConfiguration$IpAssignment");
Object ipAssignment = Enum.valueOf(ipAssignmentCls, "STATIC");
Method setIpAssignmentMethod = wifiConfig.getClass().getDeclaredMethod("setIpAssignment", ipAssignmentCls);
setIpAssignmentMethod.invoke(wifiConfig, ipAssignment);
Method setStaticIpConfigurationMethod = wifiConfig.getClass().getDeclaredMethod("setStaticIpConfiguration", staticIpConfiguration.getClass());
//设置静态IP,将StaticIpConfiguration设置给WifiConfiguration
setStaticIpConfigurationMethod.invoke(wifiConfig, staticIpConfiguration);
//WifiConfiguration重新添加到WifiManager
int netId = wifiManager.addNetwork(wifiConfig);
wifiManager.disableNetwork(netId);
boolean flag = wifiManager.enableNetwork(netId, true);
} catch (NoSuchFieldException | IllegalAccessException | InstantiationException | InvocationTargetException | ClassNotFoundException | NoSuchMethodException e) {
e.printStackTrace();
}
通过WifiConfiguration的setStaticIpConfiguration方法将StaticIpConfiguration对象设置进去,通过setIpAssignment,将IpAssignment设置进去,值设为STATIC,最后根据netId 重启这个网络,即可将静态IP设置成功。