android13 系统默认设置静态IP

devtools/2024/9/29 16:18:29/

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/devtools/118762.html

相关文章

水波荡漾效果+渲染顺序+简单UI绘制

创建场景及布置 创建新场景Main,在Main场景中创建一个plane物体&#xff0c;命名为WaterWavePla,具体数值及层级面板排布如下&#xff1a; 编写脚本 创建一个文件夹&#xff0c;用于存放脚本&#xff0c;命名Scripts,创建一个子文件夹Effect,存放特效相关脚本&#xff0c;创建…

python学习记录4

目录 (1)位运算 (2)运算的优先级 (1)位运算 位运算是将数字看做二进制数来运算的&#xff0c;位运算分为按位与&#xff08;&&#xff09;、按位或&#xff08;|&#xff09;、按位异或&#xff08;^&#xff09;、按位取反(~)。还有移位运算&#xff08;左移位<<、…

【分布式微服务云原生】K8s(Kubernetes)基本概念和使用方法

Kubernetes简称K8S,是一个强大的开源容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。它最初由Google设计&#xff0c;并由Cloud Native Computing Foundation&#xff08;CNCF&#xff09;维护。以下是Kubernetes的一些基本概念和使用方法。 基本概念 集…

【折腾笔记】雷池WAF社区版自动SSL续签

前言 由于雷池WAF社区版本的证书不支持通配符域名申请&#xff0c;所以我们使用ACME进行域名申请并实现自动续期。下面我将用Debian 12 的系统进行演示安装ACME客户端和以及使用它完自动续期。 简介 ACME是"Automatic Certificate Management Environment"&#x…

uniapp app 端通过webview引入外部 js , webview 与 app 通信

背景 用户登录需要接入腾讯的无感验证&#xff0c;在 index.html 文件里引入 js 文件是不生效的。查看官网相关内容&#xff0c;app 引入只支持 webview 的形式&#xff0c;因为他的 js 文件里面会用到浏览器里的变量&#xff0c;因此就算下载到本地引入也无法使用。 当前项目…

bash使用注意事项

注意事项 在 Bash 脚本中&#xff0c;变量的取值、赋值和定义有一些注意事项&#xff0c;下面列出了一些关键点&#xff1a; 1. 变量赋值 没有空格&#xff1a;在赋值时&#xff0c;等号 前后不能有空格。例如&#xff1a; my_varvalue # 正确 my_var value # 错误字符限…

Elasticsearch实战应用:构建高效搜索引擎

在大数据时代&#xff0c;如何高效存储和检索海量信息成为了一个重要课题。Elasticsearch作为一个开源的分布式搜索引擎&#xff0c;以其强大的搜索能力和灵活的扩展性&#xff0c;成为了许多企业和开发者的首选。本文将深入探讨Elasticsearch的实战应用&#xff0c;包括基本概…

前端框架对比与选择:React、Vue、Angular 与 Svelte 的全方位分析

前言 随着前端技术的快速发展&#xff0c;前端框架的选择变得尤为重要。无论是构建小型应用&#xff0c;还是规划大型企业级项目&#xff0c;选择合适的前端框架能够极大地提升开发效率、维护性和可扩展性。本文将详细对比目前主流的四个前端框架&#xff1a;React、Vue.js、A…