android13 系统默认设置静态IP

server/2024/11/12 21:25:20/

android11系统的时候,默认静态IP设置很简单,修改frameworks\base\core\res\res\values\config.xml中的config_ethernet_interfaces字符数组,在里面添加静态IP的参数就可以了。
 

    <string-array translatable="false" name="config_ethernet_interfaces"><!--<item>eth1;12,13,14,15;ip=192.168.0.10/24 gateway=192.168.0.1 dns=4.4.4.4,8.8.8.8</item><item>eth2;;ip=192.168.0.11/24</item><item>eth3;12,13,14,15;ip=192.168.0.12/24;1</item>--></string-array>

android13以后,这个参数移动到了packages\modules\Connectivity\service\ServiceConnectivityResources\res\values\config.xml下面,修改以后以太网是能够默认静态IP,但是发现以太网上不了网了,设置动态IP也不行。很是奇怪。后面只能通过另外一种方式去设置,即开机启动的时候去设置一次静态IP。

具体使用如下几个函数:

	public void initEthIp(Context context){boolean issetIP = SystemProperties.getInt("persist.sys.eth_static_ip_flag", 0) == 1 ? true:false;if(issetIP){return;}if(setEthIPAddress(context, "192.168.1.2", "255.255.255.0", "192.168.1.200", "192.168.1.200","8.8.8.8")){SystemProperties.set("persist.sys.eth_static_ip_flag", "1");Log.d(TAG, "set static eth ip ok!");}else{Log.d(TAG, "set static eth ip failed!");}}public boolean setEthIPAddress(Context context, String IP, String Mask, String Gateway, String DNS, String DNS2){String Interface = "eth0";EthernetManager mEthManager;mEthManager = (EthernetManager) (EthernetManager)context.getSystemService(Context.ETHERNET_SERVICE);IpConfiguration.IpAssignment mIpAssignment = IpConfiguration.IpAssignment.DHCP;if (mEthManager != null) {if (isIpAddress(IP) && isIpAddress(Mask) && isIpAddress(Gateway)&& isIpAddress(DNS)) {StaticIpConfiguration mStaticIpConfiguration = new StaticIpConfiguration();if (validateIpConfigFields(mStaticIpConfiguration, IP, Mask,Gateway, DNS, DNS2) != 0) {return false;} else {mEthManager.setEthernetEnabled(false);Inet4Address inetAddr = getIPv4Address(IP);int prefixLength = maskStr2InetMask(Mask);InetAddress gatewayAddr = getIPv4Address(Gateway);InetAddress dnsAddr = getIPv4Address(DNS);if (inetAddr.getAddress().toString().isEmpty() || prefixLength == 0 || gatewayAddr.toString().isEmpty()|| dnsAddr.toString().isEmpty()) {return false;}ArrayList<InetAddress> dnsServers = new ArrayList<>();dnsServers.add(dnsAddr);if (!DNS2.isEmpty()) {dnsServers.add(getIPv4Address(DNS2));}final StaticIpConfiguration.Builder staticIPBuilder = new StaticIpConfiguration.Builder().setDnsServers(dnsServers).setDomains(mStaticIpConfiguration.getDomains()).setGateway(gatewayAddr).setIpAddress(new LinkAddress(inetAddr, prefixLength));mStaticIpConfiguration = staticIPBuilder.build();IpConfiguration ipConfiguration = new IpConfiguration();ipConfiguration.setIpAssignment(IpConfiguration.IpAssignment.STATIC);ipConfiguration.setProxySettings(IpConfiguration.ProxySettings.NONE);ipConfiguration.setStaticIpConfiguration(mStaticIpConfiguration);mEthManager.setConfiguration(Interface, ipConfiguration);mEthManager.setEthernetEnabled(true);return true;}} else {return false;}}return false;}private Inet4Address getIPv4Address(String text) {try {return (Inet4Address) InetAddresses.parseNumericAddress(text);} catch (IllegalArgumentException | ClassCastException e) {return null;}}public 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;}private boolean isIpAddress(String value) {int start = 0;int end = value.indexOf('.');int numBlocks = 0;while (start < value.length()) {if (end == -1) {end = value.length();}try {int block = Integer.parseInt(value.substring(start, end));if ((block > 255) || (block < 0)) {return false;}} catch (NumberFormatException e) {return false;}numBlocks++;start = end + 1;end = value.indexOf('.', start);}return numBlocks == 4;}private int validateIpConfigFields(StaticIpConfiguration staticIpConfiguration, String ipAddr,String netmask, String gateway, String dns, String dns2) {final StaticIpConfiguration.Builder staticIPBuilder = new StaticIpConfiguration.Builder().setDnsServers(staticIpConfiguration.getDnsServers()).setDomains(staticIpConfiguration.getDomains()).setGateway(staticIpConfiguration.getGateway()).setIpAddress(staticIpConfiguration.getIpAddress());Inet4Address inetAddr = getIPv4Address(ipAddr);if (inetAddr == null) {return 2;}int networkPrefixLength = -1;networkPrefixLength = maskStr2InetMask(netmask);if(networkPrefixLength == 0){return 3;}InetAddress gatewayAddr = getIPv4Address(gateway);if (gatewayAddr == null) {return 4;}staticIPBuilder.setGateway(gatewayAddr);ArrayList<InetAddress> dnsServers = new ArrayList<>();InetAddress dnsAddr = null;dnsAddr = getIPv4Address(dns);if (dnsAddr == null) {return 5;}dnsServers.add(dnsAddr);InetAddress dnsAddr2 = null;dnsAddr2 = getIPv4Address(dns2);if (dnsAddr2 == null) {return 6;}dnsServers.add(dnsAddr2);staticIpConfiguration  = staticIPBuilder.build();return 0;}

每次开机的时候可以在系统应用中接收开机广播。然后调用initEthIp函数,去检测是否已经设置过静态IP,如果设置过了就用一个系统属性保存标志位,下次再开机的时候判断标志位是否再设置静态IP。


http://www.ppmy.cn/server/121783.html

相关文章

IDEA类和方法注释模板设置

一、概述 IDEA自带的注释模板不是太好用&#xff0c;我本人到网上搜集了很多资料系统的整理了一下制作了一份比较完整的模板来分享给大家&#xff0c;写这篇文章只是为了让大家省事。 适用于通过在项目工具窗口中调用新建 | Java 类 | 类创建的新 Java 类。 此内置模板…

C 字符串操作

strcpy char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。 #include <stdio.h> #include <stdlib.h> #include <string.h>char* my_strcpy(char *dst, char *src) {if(dst NULL || src NULL){return NULL;}char *ret dst…

2024最新Linux发行版,Kali Linux迎来劲敌,零基础入门到精通,收藏这一篇就够了

概念简介 Parrot OS 是一款基于 Debian 的 Linux 发行版&#xff0c;专门为安全研究、渗透测试、开发以及隐私保护而设计。由 Frozenbox 团队开发的 Parrot OS&#xff0c;结合了现代安全工具、用户友好的环境以及出色的隐私保护特性&#xff0c;成为网络安全从业者、开发人员…

2024.9.24 Python与C++面试八股文

1.extern extern关键字用于在多个文件中引用同一个全局变量的声明 在一个头文件中&#xff0c;如果这个变量声明了&#xff0c;但是在cpp文件中没找到他的定义&#xff0c;那么编译就会报错&#xff0c;但是如果加了extern&#xff0c;编译器就不会给头文件报错&#xff0c;而…

中序遍历二叉树全过程图解

文章目录 中序遍历图解总结拓展&#xff1a;回归与回溯 中序遍历图解 首先看下中序遍历的代码&#xff0c;其接受一个根结点root作为参数&#xff0c;判断根节点是否为nil&#xff0c;不为nil则先递归遍历左子树。 func traversal(root *TreeNode,res *[]int) {if root nil …

【数据库】sqlite

文章目录 1. 基本概述2. 主要特点3. 应用场景4. 优缺点5. 基本使用示例6. 在编程语言中的使用连接到 SQLite 数据库&#xff08;如果文件不存在会自动创建&#xff09;创建表插入数据提交事务查询数据关闭连接 7. 总结 SQLite 是一个轻量级的关系型数据库管理系统&#xff08;R…

linux 下的静态库与动态库

目录 一、介绍 1、静态库 2、动态库 二、操作 1、静态库 2、动态库 3、使用库文件 &#xff08;1&#xff09;方法一 &#xff08;2&#xff09;方法二 &#xff08;3&#xff09;方法三 一、介绍 1、静态库 静态链接库实现链接操作的方式很简单&#xff0c;即程序文…

JAVA同城生活新引擎外卖跑腿团购到店服务多合一高效系统小程序源码

&#x1f680;同城生活新风尚&#xff01;一站式高效系统&#xff0c;让日常更便捷&#x1f6cd;️ &#x1f37d;️【开篇&#xff1a;同城生活&#xff0c;一触即发】&#x1f37d;️ 在这个快节奏的时代&#xff0c;同城生活的便利性与效率成为了我们追求的新风尚。想象一下…