admin 管理员组文章数量: 1184232
想要在代码中实现设置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 =newClass[]{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");//实例化StaticIpConfigurationObject 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);//设置dnsArrayList<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设置成功。
版权声明:本文标题:轻松搞定Android手机的WIFI静态IP和DNS设置 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1773617149a3563995.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论