简单的一个函数实现对wifi设置静态或动态IP地址。

一、需要的权限

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.OVERRIDE_WIFI_CONFIG"tools:ignore="ProtectedPermissions" />

可以删除该WiFi 和修改。

二、清单文件需要将shareduserid设置成system。

android:sharedUserId="android.uid.system"

三、具体函数,函数执行条件是wifi开关打开,并且要设置的wifi已经连接成功。

    // 定义几种加密方式,一种是WEP,一种是WPA,还有没有密码的情况public enum WifiCipherType {WIFICIPHER_WEP, WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID}/*** @param context   use Application context is better* @param ipAddress ip address: like 192.168.1.168* @param mode      : STATIC or DHCP, set static or dhcp ip mode* @param netmask   ip mask, like 255.255.255.0* @param gateway   gateway, like 192.168.1.1* @param dns1      dns 1* @param dns2      dns 2, if mode=static, then can use "" or null* @param ssid current has connected wifi ssid* @param pwd current has connected wifi pwd* @param wifiCipherType current has connected wifi capabilities*                  eg. dhcp mode: setWifiStaticIP(ApplicationContext, "DHCP", "", "", "", "", "", "test", "123456", WifiCipherType.WIFICIPHER_WPA);*                  static mode: setWifiStaticIP(ApplicationContext, "STATIC",*                  "192.168.1.168", "255.255.255.0",*                  "192.168.1.1", "114.114.114.114", "8.8.8.8", "test", "123456", WifiCipherType.WIFICIPHER_WPA);*                  for android 9.0*/public static boolean setWifiStaticIP(Context context, String mode, String ipAddress, String netmask,String gateway, String dns1, String dns2,String ssid, String pwd, WifiCipherType wifiCipherType) {if (context == null || (!"STATIC".equals(mode) && !"DHCP".equals(mode))|| TextUtils.isEmpty(ssid) || wifiCipherType == null|| TextUtils.isEmpty(wifiCipherType.name())) {Log.d(TAG, " setWifiStaticIP failed, param incorrect context=" + context + ", mode=" + mode);return false;}try {WifiManager wifiManager = ((WifiManager) context.getSystemService(Context.WIFI_SERVICE));if ("DHCP".equals(mode)) {IpConfiguration dhcpConfiguration = new IpConfiguration(IpConfiguration.IpAssignment.DHCP,IpConfiguration.ProxySettings.NONE, null, null);dhcpConfiguration.setIpAssignment(IpConfiguration.IpAssignment.DHCP);WifiConfiguration wifiConfiguration = createWifiConfig(ssid, pwd, wifiCipherType, dhcpConfiguration);// current assignment is DHCP OR STATICString assignMent = wifiConfiguration.getIpConfiguration().ipAssignment.name();Log.d(TAG, " setWifiStaticIP assignMent=" + assignMent + ", mode=" + mode);wifiManager.setWifiApConfiguration(wifiConfiguration);// update networkwifiManager.updateNetwork(wifiConfiguration);// reconnectint netId = wifiManager.addNetwork(wifiConfiguration);wifiManager.disableNetwork(netId);wifiManager.enableNetwork(netId, true);Log.i(TAG, " setWifiStaticIP dhcp set success");return true;}// set static ip addressIpConfiguration ipConfiguration = getStaticIpConfiguration(ipAddress, netmask, gateway, dns1, dns2);if (ipConfiguration != null) {WifiConfiguration wifiConfiguration = createWifiConfig(ssid, pwd, wifiCipherType, ipConfiguration);wifiManager.setWifiApConfiguration(wifiConfiguration);// update networkwifiManager.updateNetwork(wifiConfiguration);// reconnectint netId = wifiManager.addNetwork(wifiConfiguration);wifiManager.disableNetwork(netId);wifiManager.enableNetwork(netId, true);Log.i(TAG, "setWifiStaticIP set static ip success");return true;} else {Log.w(TAG, "setWifiStaticIP set static ip failed");return false;}} catch (Exception e) {Log.e(TAG, "setWifiStaticIP e=" + e.getMessage());}return false;}private static IpConfiguration getStaticIpConfiguration(String ipAddress, String netmask, String gateway, String dns1, String dns2) {try {StaticIpConfiguration staticIpConfiguration = new StaticIpConfiguration();int prefixLength = maskStr2InetMask(netmask);InetAddress inetAddr = null;InetAddress gatewayAddr = getIPv4Address(gateway);InetAddress dnsAddr = getIPv4Address(dns1);if (TextUtils.isEmpty(ipAddress)) {inetAddr = getLocalIPAddress();} else {String[] ipStr = ipAddress.split("\\.");byte[] ipBuf = new byte[4];for (int i = 0; i < 4; i++) {ipBuf[i] = (byte) (Integer.parseInt(ipStr[i]) & 0xff);}try {inetAddr = InetAddress.getByAddress(ipBuf);Log.d(TAG, "getStaticIpConfiguration  address correct inetAddr=" + inetAddr);} catch (UnknownHostException e) {e.printStackTrace();}}if (inetAddr == null || inetAddr.getAddress().toString().isEmpty()|| prefixLength == 0 || gatewayAddr.toString().isEmpty()|| dnsAddr == null || dnsAddr.toString().isEmpty()) {Log.d(TAG, " getStaticIpConfiguration  address incorrect inetAddr=" + inetAddr);return null;}Class<?> linkAddressClass = null;linkAddressClass = Class.forName("android.net.LinkAddress");Class[] cl = new Class[]{InetAddress.class, int.class};Constructor cons = null;try {cons = linkAddressClass.getConstructor(cl);} catch (NoSuchMethodException e) {e.printStackTrace();}Object[] x = {inetAddr, prefixLength};try {staticIpConfiguration.ipAddress = (LinkAddress) cons.newInstance(x);Log.d(TAG, " getStaticIpConfiguration staticIpConfiguration.ipAddress=" + staticIpConfiguration.ipAddress);} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {e.printStackTrace();}staticIpConfiguration.gateway = gatewayAddr;staticIpConfiguration.dnsServers.add(dnsAddr);if (!dns2.isEmpty())staticIpConfiguration.dnsServers.add(getIPv4Address(dns2));Log.d(TAG, " getStaticIpConfiguration staticIpConfiguration  ====" + staticIpConfiguration+ ", inetAddr=" + inetAddr);IpConfiguration ipConfiguration = new IpConfiguration(IpConfiguration.IpAssignment.STATIC,IpConfiguration.ProxySettings.NONE, staticIpConfiguration, null);ipConfiguration.setIpAssignment(IpConfiguration.IpAssignment.STATIC);ipConfiguration.setStaticIpConfiguration(staticIpConfiguration);return ipConfiguration;} catch (Exception e) {Log.e(TAG, "getStaticIpConfiguration ERROR=" + e.getMessage());}return null;}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2020/07/22补充上述中缺失的函数。

    /** convert subMask string to prefix length*/public static int maskStr2InetMask(String maskStr) {StringBuffer sb;String str;int inetmask = 0;int count = 0;/** check the subMask format*/Pattern pattern = Pattern.compile("(^((\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])$)|^(\\d|[1-2]\\d|3[0-2])$");if (pattern.matcher(maskStr).matches() == false) {Log.e(TAG, "subMask is error");return 0;}String[] ipSegment = maskStr.split("\\.");for (int n = 0; n < ipSegment.length; n++) {sb = new StringBuffer(Integer.toBinaryString(Integer.parseInt(ipSegment[n])));str = sb.reverse().toString();count = 0;for (int i = 0; i < str.length(); i++) {i = str.indexOf("1", i);if (i == -1)break;count++;}inetmask += count;}return inetmask;}
public static InetAddress getIPv4Address(String text) {try {return NetworkUtils.numericToInetAddress(text);} catch (IllegalArgumentException | ClassCastException e) {return null;}}
    /*** Get local Ip address.*/public static InetAddress getLocalIPAddress() {Enumeration<NetworkInterface> enumeration = null;try {enumeration = NetworkInterface.getNetworkInterfaces();} catch (SocketException e) {e.printStackTrace();}if (enumeration != null) {while (enumeration.hasMoreElements()) {NetworkInterface nif = enumeration.nextElement();Enumeration<InetAddress> inetAddresses = nif.getInetAddresses();if (inetAddresses != null) {while (inetAddresses.hasMoreElements()) {InetAddress inetAddress = inetAddresses.nextElement();if (!inetAddress.isLoopbackAddress() && isIPv4Address(inetAddress.getHostAddress())) {return inetAddress;}}}}}return null;}
public static WifiConfiguration createWifiConfig(String SSID, String password,WifiCipherType type,IpConfiguration ipConfiguration) {WifiConfiguration config = new WifiConfiguration();config.allowedAuthAlgorithms.clear();config.allowedGroupCiphers.clear();config.allowedKeyManagement.clear();config.allowedPairwiseCiphers.clear();config.allowedProtocols.clear();config.SSID = "\"" + SSID + "\"";config.setIpConfiguration(ipConfiguration);if (type == WifiCipherType.WIFICIPHER_NOPASS) {
//            config.wepKeys[0] = "";  //注意这里config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
//            config.wepTxKeyIndex = 0;}if (type == WifiCipherType.WIFICIPHER_WEP) {config.preSharedKey = "\"" + password + "\"";config.hiddenSSID = true;config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);config.wepTxKeyIndex = 0;}if (type == WifiCipherType.WIFICIPHER_WPA) {config.preSharedKey = "\"" + password + "\"";config.hiddenSSID = true;config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);config.status = WifiConfiguration.Status.ENABLED;}return config;}
    /*** Ipv4 address check.*/private static final Pattern IPV4_PATTERN = Pattern.compile("^(" + "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}" +"([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$");/*** Check if valid IPV4 address.** @param input the address string to check for validity.* @return True if the input parameter is a valid IPv4 address.*/public static boolean isIPv4Address(String input) {return IPV4_PATTERN.matcher(input).matches();}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2021/1/7补充,设置当前连接的wifi为静态IP或自动获取IP ,在安卓5.1.1测试通过,这样就不需要传入SSID,密码和加密方式了。

    /*** @param context   use Application context is better* @param ipAddress ip address: like 192.168.1.168* @param mode      : STATIC or DHCP, set static or dhcp ip mode* @param netmask   ip mask, like 255.255.255.0* @param gateway   gateway, like 192.168.1.1* @param dns1      dns 1* @param dns2      dns 2, if mode=static, then can use "" or null*                  eg. dhcp mode: setWifiStaticIP(ApplicationContext, "DHCP", "", "", "", "", "");*                  static mode: setWifiStaticIP(ApplicationContext, "STATIC",*                  "192.168.1.168", "255.255.255.0",*                  "192.168.1.1", "114.114.114.114", "8.8.8.8");*                  for android 9.0 or 5.1*/public boolean setWifiStaticIP(Context context, String mode, String ipAddress, String netmask,String gateway, String dns1, String dns2) {if (context == null || (!"STATIC".equals(mode) && !"DHCP".equals(mode))) {Log.d(TAG, " setWifiStaticIP failed, param incorrect context=" + context + ", mode=" + mode);return false;}try {WifiManager wifiManager = ((WifiManager) context.getSystemService(Context.WIFI_SERVICE));if ("DHCP".equals(mode)) {IpConfiguration dhcpConfiguration = new IpConfiguration(IpConfiguration.IpAssignment.DHCP,IpConfiguration.ProxySettings.NONE, null, null);dhcpConfiguration.setIpAssignment(IpConfiguration.IpAssignment.DHCP);WifiConfiguration wifiConfiguration = getCurrentConfig();if (wifiConfiguration != null) {wifiConfiguration.setIpConfiguration(dhcpConfiguration);// current assignment is DHCP OR STATICString assignMent = wifiConfiguration.getIpConfiguration().ipAssignment.name();Log.d(TAG, " setWifiStaticIP assignMent=" + assignMent + ", mode=" + mode);wifiManager.setWifiApConfiguration(wifiConfiguration);// update networkwifiManager.updateNetwork(wifiConfiguration);// reconnectint netId = wifiManager.addNetwork(wifiConfiguration);wifiManager.disableNetwork(netId);wifiManager.enableNetwork(netId, true);Log.i(TAG, " setWifiStaticIP dhcp set success");return true;} else {return false;}}// set static ip addressIpConfiguration ipConfiguration = getStaticIpConfiguration(ipAddress, netmask, gateway, dns1, dns2);if (ipConfiguration != null) {WifiConfiguration wifiConfiguration = getCurrentConfig();if (wifiConfiguration != null) {wifiConfiguration.setIpConfiguration(ipConfiguration);wifiManager.setWifiApConfiguration(wifiConfiguration);// update networkwifiManager.updateNetwork(wifiConfiguration);// reconnectint netId = wifiManager.addNetwork(wifiConfiguration);wifiManager.disableNetwork(netId);wifiManager.enableNetwork(netId, true);Log.i(TAG, "setWifiStaticIP set static ip success");return true;} else {return false;}} else {Log.w(TAG, "setWifiStaticIP set static ip failed");return false;}} catch (Exception e) {Log.e(TAG, "setWifiStaticIP e=" + e.getMessage());}return false;}/*** 获取当前网络配置信息*/public WifiConfiguration getCurrentConfig(){WifiManager mWifiManager = ((WifiManager) context.getSystemService(Context.WIFI_SERVICE));WifiInfo connectionInfo = mWifiManager.getConnectionInfo();  //得到连接的wifi网络WifiConfiguration wifiConfig = null;List<WifiConfiguration> configuredNetworks = mWifiManager.getConfiguredNetworks();for (WifiConfiguration conf : configuredNetworks) {if (conf.networkId == connectionInfo.getNetworkId()) {wifiConfig = conf;break;}}return wifiConfig;}

因为部分api在framework.jar中才有,所以需要导入framework.jar作为依赖,另外测试时app用了platform签名。

framework.jar可以在https://github.com/zzhceo/EthernetStaticIp获取。

在模块的build.gradle中加入依赖framework.jar方式如下:

dependencies {//... ...// framework.jar placed in app/libs directorycompileOnly files('libs/framework.jar')
}

部分参考:https://blog.csdn.net/ink_s/article/details/78720544

以太网静态、动态IP设置可参考我的另一篇文章:https://blog.csdn.net/zzhceo/article/details/99596435

安卓9.0设置WIFI静态IP地址。相关推荐

  1. 如何设置局域网静态ip地址?

    一.什么是静态ip地址? 静态IP地址即固定IP地址,是长期固定分配给一台计算机使用的IP地址,一般只是作为特殊服务器的电脑才拥有静态IP地址.静态IP地址是手动设置的. 二.设置静态ip地址有什么好 ...

  2. 如何在 Debian 11 上设置一个静态 IP 地址

    当你在电脑上安装一个新的操作系统时,DHCP服务器会给你分配一个动态IP地址.然而,在各种情况下,你可能需要在你的机器上设置一个静态IP地址,例如,当你正在托管一个网络服务器,或者任何服务需要一个IP ...

  3. 设置WiFi静态ip、网关、子网掩码、dns

    /*** 设置WiFi静态ip等配置** @param context* @param ip* @param gateWay* @param dns1* @param dns2*/ public bo ...

  4. Android设置WIFI静态IP

    想要在代码中实现设置WIFI静态IP需要有系统权限,要在manifest文件添加android:sharedUserId="android.uid.system",还要有系统签名. ...

  5. win10 设置为静态ip地址

    问题 有时候明明连接了wifi,网络却不能用,这时候需要修改IP地址配置的方式. 解决方法 设置为自动获取IP地址 打开控制面板 → 网络和Internet → 网路共享中心(查看网络状态和任务)→ ...

  6. linux网线插拔后ip地址丢失,网线拔掉检测,嵌入式网线直连开发板断电网线拔掉之后,上电仍能自动设置static静态ip地址...

    网线拔掉检测,嵌入式网线直连开发板断电网线拔掉之后,上电仍能自动设置静态ip地址 1.首先设置永久固定静态ip地址 luther@gliethttp:~$ sudo vim /etc/network/ ...

  7. kali Linux隐藏IP教程,Kali Linux 设置动/静态IP地址以及修改DNS

    一. 设置IP地址 动/静态 IP 地址设置路径: vim /etc/network/interfaces 1.1 动态IP 配置文件: # This file describes the netwo ...

  8. android设置静态i,关于Android4.0系统下如何设置wlan静态ip的设置(转)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 估计有不少人都以为Android4.0系统下如何设置wlan静态ip地址吧,其实不是Android4.0的问题,只是设置上有点区别而已,下面重新教大家如何 ...

  9. centos7设置静态IP地址

    1.查看IP配置信息 ifconfig 如上图所示,我的em1网卡已配置好 2.编辑em1对应的配置文件,位于/etc/sysconfig/network-scripts/ifcfg-你的网卡名字 操 ...

最新文章

  1. Transformer又出新变体∞-former:无限长期记忆,任意长度上下文
  2. idea查看项目pid_idea启动时的端口号
  3. 幼儿课外活动游戏_幼儿园户外游戏活动大全
  4. 如何保护移动应用程序安全–移动应用程序安全检查表
  5. jl计算机二级c语言考什么,计算机等级考试二级C语言考前密卷(9)2
  6. pycharm引用python_在Python/Pycharm中找不到引用“xxx”
  7. centos 7 菜鸟第一天 装软件
  8. NLP学习—12.Seq2Seq模型与Attention机制
  9. unity中使用本地数据库sqlite
  10. CSDN创始人董事长蒋涛对话阿里云张献涛:距离云计算终极目标还有多远?
  11. 科研过程中如何寻找创新点
  12. Java实现PDF转换成图片
  13. Copy and Paste GAN: Face Hallucination from Shaded Thumbnails
  14. 那些会阻碍程序员成长的细节
  15. 打开win10电脑的蓝牙
  16. html中zoom方法,css中的zoom的作用
  17. 《东周列国志》第一回 周宣王闻谣轻杀 杜大夫化厉鸣冤
  18. 【Verilog】时序逻辑电路 -- 程序设计与应用
  19. 与或非逻辑运算符用法详解
  20. [教学] 以远程工作模式教你实战编程经验

热门文章

  1. Mysql配置文件my.cnf配置及配置参数详解
  2. 移动端对比后端逐渐“式微”?在互联网大环境下如何避免久当生锈的”螺丝钉”去成为一个优秀的Android开发者?
  3. 【每日一题】最大正方形面积——进阶,矩形面积
  4. 使用vs2019创建win32动态链接库
  5. 为什么大家认为中台不能用于传统行业?
  6. MySQL数据库,数据的约束
  7. 如何入门“动物杂交:新视野”
  8. Python3.6下CMD命令安装ipython
  9. 免费资源和IT常用链接
  10. python3 延时、定时、指定时间执行任务的几种方法