当前位置: 首页 > news >正文

安卓11添加切换以太网动态静态方法

客户要在app中自由切换动态,静态方法,直接把系统jar-api给他搞了半天搞不定,只有在系统里给他实现一个接口,方法如下:

Index: packages/apps/Settings/AndroidManifest.xml
===================================================================
--- packages/apps/Settings/AndroidManifest.xml	(revision 868)
+++ packages/apps/Settings/AndroidManifest.xml	(revision 869)
@@ -5,7 +5,7 @@android:sharedUserId="android.uid.system"><original-package android:name="com.android.settings" />
-
+     <uses-permission android:name="android.net.action.ETHERNET_IP_CHANGED"/><uses-permission android:name="android.permission.REQUEST_NETWORK_SCORES" /><uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" /><uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
@@ -3504,6 +3504,14 @@</intent-filter>/></receiver>+	<receiver android:name=".ethernet.EtherentBoardcastReceiver"
+			 android:enabled="true"
+			 android:exported="true">
+             <intent-filter android:priority="1000">
+                <action android:name="android.net.action.ETHERNET_IP_CHANGED" />
+            </intent-filter>
+        </receiver>
+<!-- This is the longest AndroidManifest.xml ever. --></application></manifest>
Index: packages/apps/Settings/src/com/android/settings/ethernet/EtherentBoardcastReceive.java
===================================================================
--- packages/apps/Settings/src/com/android/settings/ethernet/EtherentBoardcastReceive.java     (nonexistent)
+++ packages/apps/Settings/src/com/android/settings/ethernet/EtherentBoardcastReceive.java     (revision 869)
@@ -0,0 +1,220 @@
+package com.android.settings.ethernet;
+
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.admin.DevicePolicyManager;
+import android.content.ActivityNotFoundException;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.SystemProperties;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.PreferenceScreen;
+import android.provider.SearchIndexableResource;
+import android.provider.Settings;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.util.Log;
+import android.content.Intent;
+
+import androidx.preference.SwitchPreference;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.File;
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import java.util.regex.Pattern;
+import java.lang.Integer;
+import java.net.InetAddress;
+import java.net.Inet4Address;
+import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.Preference.OnPreferenceClickListener;
+
+import com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment;
+
+
+/*for 5.0*/
+import android.net.EthernetManager;
+import android.net.IpConfiguration;
+import android.net.IpConfiguration.IpAssignment;
+import android.net.IpConfiguration.ProxySettings;
+import android.net.wifi.SupplicantState;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.net.StaticIpConfiguration;
+import android.net.NetworkUtils;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.widget.Toast;
+//import android.preference.ListPreference;
+//import com.android.internal.logging.MetricsProto.MetricsEvent;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+
+
+import com.android.settings.ethernet.ethernet_static_ip_dialog;
+public class EtherentBoardcastReceiver extends BroadcastReceiver  {
+	private static final String TAG = "EtherentBoardcastReceiver";
+	 
+	private  static String mEthMode = null
+    private  static String mEthIpAddress = null;
+    private  static String mEthNetmask = null;
+    private  static String mEthGateway = null;
+    private  static String mEthdns1 = null;
+    private  static String mEthdns2 = null;
+
+    private final static String nullIpInfo = "0.0.0.0";
+	private String mIfaceName;
+	 @Override
+    public void onReceive(Context context, Intent intent) {
+
+			IpConfiguration mIpConfiguration;
+			StaticIpConfiguration mStaticIpConfiguration;
+			String action = intent.getAction();
+		    Log.i(TAG, "receive a new action : " + action);
+			
+			EthernetManager mEthManager = (EthernetManager) context.getSystemService(Context.ETHERNET_SERVICE);
+			if(mEthManager == null){
+				Log.i(TAG, "fail to getSystemService :  "+Context.ETHERNET_SERVICE);
+			}
+
+		  mStaticIpConfiguration =new StaticIpConfiguration();
+		  getNetConfigFromIntent(intent);
+		 /*
+		  * get ip address, netmask,dns ,gw etc.
+		  */
+		String[] ifaces = mEthManager.getAvailableInterfaces();
+        if (ifaces.length > 0) {
+            mIfaceName = ifaces[0];//"eth0";
+        }
+        if (null == mIfaceName) {
+            Log.e(TAG, "get ethernet ifaceName failed");
+            
+        }
+
+
+		if (mEthMode  == null ||mEthMode.equals("static"))
+		{
+			 Inet4Address inetAddr = getIPv4Address(this.mEthIpAddress);
+			int prefixLength = maskStr2InetMask(this.mEthNetmask); 
+			InetAddress gatewayAddr = getIPv4Address(this.mEthGateway); 
+			InetAddress dnsAddr1 = getIPv4Address(this.mEthdns1);
+			InetAddress dnsAddr2 = getIPv4Address(this.mEthdns2);
+			if(inetAddr ==null || gatewayAddr == null || prefixLength <= 0  ){
+				  Log.e(TAG,"ip,mask or dnsAddr is wrong");
+				  return ;
+			}
+			if (inetAddr.getAddress().toString().isEmpty() || prefixLength ==0 || gatewayAddr.toString().isEmpty()
+			  ) {
+				   Log.e(TAG,"ip,mask or dnsAddr is wrong");
+				  return ;
+			}
+			  
+			mStaticIpConfiguration.ipAddress = new LinkAddress(inetAddr, prefixLength);
+			mStaticIpConfiguration.gateway=gatewayAddr;
+			if(dnsAddr1 != null && !dnsAddr1.toString().isEmpty())
+				mStaticIpConfiguration.dnsServers.add(dnsAddr1);
+			if(dnsAddr2 != null && !dnsAddr2.toString().isEmpty())
+				mStaticIpConfiguration.dnsServers.add(dnsAddr2);
+		
+			mIpConfiguration=new IpConfiguration(IpAssignment.STATIC, ProxySettings.NONE,mStaticIpConfiguration,null);  
+			mEthManager.setConfiguration(mIfaceName, mIpConfiguration); 
+		}else{
+			mEthManager.setConfiguration(mIfaceName, new IpConfiguration(IpAssignment.DHCP, ProxySettings.NONE,null,null));
+		}
+       
+		//
+		
+    }
+	
+	private void getNetConfigFromIntent(Intent intent){
+		Bundle bundle = intent.getExtras();
+        if (bundle.getString("netMode") != null)
+			this.mEthMode = bundle.getString("netMode");
+		if (bundle.getString("ipaddr") != null)
+			this.mEthIpAddress = bundle.getString("ipaddr");
+		if (bundle.getString("netMask")!= null)
+			this.mEthNetmask = bundle.getString("netMask");
+		if (bundle.getString("gateway")!= null)
+			this.mEthGateway = bundle.getString("gateway");
+		if (bundle.getString("dns1") != null)
+			this.mEthdns1 = bundle.getString("dns1");
+		if (bundle.getString("dns2") != null)
+			this.mEthdns2 = bundle.getString("dns2");
+	}
+	 private Inet4Address getIPv4Address(String text) {
+        try {
+            return (Inet4Address) NetworkUtils.numericToInetAddress(text);
+        } catch (IllegalArgumentException|ClassCastException e) {
+            return null;
+        }
+    }
+
+	 /*
+     * convert subMask string to prefix length
+     */
+    private 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;
+    }
+
+
+
+}
+

相关文章:

安卓11添加切换以太网动态静态方法

客户要在app中自由切换动态&#xff0c;静态方法&#xff0c;直接把系统jar-api给他搞了半天搞不定&#xff0c;只有在系统里给他实现一个接口&#xff0c;方法如下&#xff1a; Index: packages/apps/Settings/AndroidManifest.xml--- packages/apps/Settings/AndroidManifes…...

初级数据结构(五)——树和二叉树的概念

文中代码源文件已上传&#xff1a;数据结构源码 <-上一篇 初级数据结构&#xff08;四&#xff09;——队列 | NULL 下一篇-> 1、树结构&#xff08;Tree&#xff09; 1.1、树结构的特点 自然界中的树由根部开始向上生长&#xff0c;随机长出分支&…...

pdf读取内容缺失(漏字/文字丢失)问题

项目中遇到pdf文件漏字&#xff0c;由于文件涉密&#xff0c;不能展示&#xff0c;简单描述一下&#xff1a; 比如原pff中 姓名&#xff1a;张三 读取结果中&#xff1a;空白&#xff1a;张三 即&#xff1a;原文件说是银行出具的打款证明&#xff0c;银行内部设置了文件权限&a…...

c#面试基础语法——现有⼀个整数number,请写⼀个⽅法判断这个整数是否是2的N次⽅

1.number%20 取余&#xff08;取模&#xff09;只能判断number是不是2的倍数但不一定是2的N次方&#xff0c;如&#xff1a;6%20但是他并不是2的N次方 2.(number&(number-1))0 原理&#xff1a;如果number是2的N次方则表示2进制位只有一位是1。如&#xff1a;2 &#xff08…...

27系列DGUS智能屏发布:可实时播放高清模拟信号摄像头视频

针对高清晰度的模拟信号摄像头视频画面的显示需求&#xff0c;迪文特推出27系列DGUS智能屏。该系列智能屏可适配常见的AHD摄像头、CVBS摄像头&#xff0c;支持单路1080P高清显示、两路720P同屏显示&#xff08;同一类型摄像头&#xff09;。用户通过DGUS简单开发即可实现摄像头…...

YOLOv8改进 | 2023主干篇 | 替换LSKNet遥感目标检测主干 (附代码+修改教程+结构讲解)

一、本文介绍 本文给大家带来的改进内容是LSKNet&#xff08;Large Kernel Selection, LK Selection&#xff09;&#xff0c;其是一种专为遥感目标检测设计的网络架构&#xff0c;其核心思想是动态调整其大的空间感受野&#xff0c;以更好地捕捉遥感场景中不同对象的范围上下…...

【工具】VUE 前端列表拖拽功能代码

【工具】VUE 前端列表拖拽功能代码 使用组件 yarn add sortablejs --save Sortable.js中文网 (sortablejs.com) 以下代码只是举个例子&#xff0c; 大家可以举一反三去实现各自的业务功能 <template><div><el-button type"primary" click"切换…...

人工智能与量子计算:开启未知领域的智慧之旅

导言 人工智能与量子计算的结合是科技领域的一场创新盛宴&#xff0c;引领我们进入了探索未知领域的新时代。本文将深入研究人工智能与量子计算的交汇点&#xff0c;探讨其原理、应用以及对计算领域的深远影响。 量子计算的崛起为人工智能领域注入了新的活力&#xff0c;开启了…...

2023了,前端实现AI电子秤思路分析

前景小知识&#xff1a; 这几年ai这个话题非常火爆&#xff0c;笔者从事零售行业软件开发也接到了新需求&#xff0c;希望实现ai电子秤&#xff0c;老规矩&#xff0c;先看需求 举个栗子&#xff1a; 或许&#xff0c;你已经留意到&#xff0c;当你在某些大型超市超市或生鲜类…...

CSS学习

CSS学习 1. 什么是css?2.css引入方式2.1 内嵌式2.2 外联式2.3 行内式2.4 引入方式特点 3. 基础选择器3.1 标签选择器3.2 类选择器3.3 id选择器3.4 通配符选择器 4. 文字基本样式4.1 字体样式4.1.1 字体大小4.1.2 字体粗细4.1.3 倾斜4.1.4 字体4.1.5 字体font相关属性连写 4.2 …...

Flask基本用法:一个HelloWorld,搭建服务、发起请求

目录 1、简介 2、安装 3、Flask使用示例 参考 1、简介 官网文档 Flask是一个轻量的web服务框架&#xff0c;我们可以利用它快速搭建一个服务&#xff0c;对外提供接口&#xff0c;其他人可以轻松调用我们的服务。这对算法工程师来说比较关键&#xff0c;我们通常不擅长搞开发…...

Tomcat-安装部署(源码包安装)

一、简介 Tomcat 是由 Apache 开发的一个 Servlet 容器&#xff0c;实现了对 Servlet 和 JSP 的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 简单来说&#xff0c;Tomcat是一个WEB应用程序的托管平台…...

【Hadoop_06】MapReduce的概述与wc案例

1、MapReduce概述1.1 MapReduce定义1.2 MapReduce优点1.3 MapReduce缺点1.4 MapReduce核心思想1.5 MapReduce进程1.6 常用数据序列化类型1.7 源码与MapReduce编程规范 2、WordCount案例实操2.1 本地测试2.2 提交到集群测试 1、MapReduce概述 1.1 MapReduce定义 MapReduce是一…...

Qt点击子窗口时父窗口标题栏高亮设计思路

父窗口调用findChildren得到其子孙窗口的列表&#xff0c;列表元素统一为QWidget*&#xff0c;遍历列表元素&#xff0c;每个元素调用installEventFilter&#xff0c;过滤QEvent::FocusIn和QEvent::FocusOut事件&#xff0c;做相应处理即可&#xff1a; QWidget* parent; QLis…...

掌握iText:轻松处理PDF文档-高级篇-添加水印

前言 iText作为一个功能强大、灵活且广泛应用的PDF处理工具&#xff0c;在实际项目中发挥着重要作用。通过这些文章&#xff0c;读者可以深入了解如何利用iText进行PDF的创建、编辑、加密和提取文本等操作&#xff0c;为日常开发工作提供了宝贵的参考和指导。 掌握iText&…...

深度学习基本概念

1.全连接层 全连接层就是该层的所有节点与输入节点全部相连&#xff0c;如图所 示。假设输入节点为X1&#xff0c; X 2&#xff0c; X 3&#xff0c;输出节点为 Y 1&#xff0c; Y 2&#xff0c; Y 3&#xff0c; Y 4。令 矩阵 W 代表全连接层的权重&#xff0c; W 12也就代表 …...

2023年最详细的:本地Linux服务器安装宝塔面板,并内网穿透实现公网远程登录

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Linux》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一…...

基于ssm金旗帜文化培训学校网站的设计与开发论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对培训学校展示信息管理混乱&#xff0c;出错率高&#xff0c;信息安全…...

【Java】猜数字小游戏

规则 游戏开始随机生成4位数字符串&#xff0c;每个数字从0到9各不相同&#xff0c;比如0123玩家10次猜数机会&#xff0c;输入4位数字符串&#xff0c;每个数字从0到9各不相同游戏判断玩家输入与所猜谜底数&#xff0c;给出结果nAnB&#xff0c;A表示位置和数字都猜对的个数&…...

汽车EDI:Chrysler EDI项目案例

菲亚特克莱斯勒汽车Fiat Chrysler Automobiles(FCA)是一家全球性汽车制造商&#xff0c;主营产品包括轿车、SUV、皮卡车、商用车和豪华车等多种车型。其旗下品牌包括菲亚特、克莱斯勒、道奇、Jeep、Ram、阿尔法罗密欧和玛莎拉蒂等。 Chrysler通过EDI来优化订单处理、交付通知、…...

Locust:可能是一款最被低估的压测工具

01、Locust介绍 开源性能测试工具https://www.locust.io/&#xff0c;基于Python的性能压测工具&#xff0c;使用Python代码来定义用户行为&#xff0c;模拟百万计的并发用户访问。每个测试用户的行为由您定义&#xff0c;并且通过Web UI实时监控聚集过程。 压力发生器作为性能…...

用23种设计模式打造一个cocos creator的游戏框架----(十八)责任链模式

1、模式标准 模式名称&#xff1a;责任链模式 模式分类&#xff1a;行为型 模式意图&#xff1a;使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一个对象处…...

100天精通风控建模(原理+Python实现)——第9天:风控建模中为什么需要特征工程?

风控模型已在各大银行和公司都实际运用于业务,用于营销和风险控制等。本文以视频的形式阐述风控建模中为什么需要特征工程。并提供风控建模原理和Python实现文章清单。    之前已经阐述了100天精通风控建模(原理+Python实现)——第1天:什么是风控建模?    100天精通风控…...

【PHP】计算某个特定时间戳距离现在的天数

在PHP中&#xff0c;你可以使用time()函数获取当前时间的时间戳&#xff0c;然后将它与你想要计算的过去或未来的时间戳进行比较。为了得到相差的天数&#xff0c;你需要先用两个时间戳相减得到秒数差&#xff0c;然后再除以一天的总秒数&#xff08;通常是86400秒&#xff09;…...

lv12 uboot移植深化 9

u-boot-2013.01移植 【实验目的】 了解u-boot 的代码结构及移植的基本方法 【实验环境】 ubuntu 14.04发行版FS4412实验平台交叉编译工具arm-none-linux-gnueabi- 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行 【实验步骤】 1 建立自己的平台 1.…...

大数据与深度挖掘:如何在数字营销中与研究互动

数字营销最吸引人的部分之一是对数据的内在关注。 如果一种策略往往有积极的数据&#xff0c;那么它就更容易采用。同样&#xff0c;如果一种策略尚未得到证实&#xff0c;则很难获得支持进行测试。 数字营销人员建立数据信心的主要方式是通过研究。这些研究通常分为两类&…...

xtu oj 1327 字符矩阵

按照示例的规律输出字符矩阵。 比如输入字母D时&#xff0c;输出字符矩阵如下 ABCDCBA BBCDCBB CCCDCCC DDDDDDD CCCDCCC BBCDCBB ABCDCBA字符矩阵行首、尾都无空格。 输入 每行一个大写英文字母&#xff0c;如果字符为#&#xff0c;表示输入结束&#xff0c;不需要处理。 …...

讨论用于评估DREX的五种DR指标

概要 动态范围是已经使用了近一个世纪的用于评估接收机性能的参数。这里介绍五种动态有关指标的定义及测试方法&#xff0c;用于评估数字接收激励器&#xff08;DREX&#xff0c;digital receiver exciters&#xff09;。DREX是构成雷达的关键整部件&#xff0c;其瞬时带宽&am…...

基于SpringBoot的在线疫苗预防小程序

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的在线疫苗预防小程序,ja…...

Kafka使用总结

1、Kafka是何如做到高性能的&#xff1f; a、消息批处理减少网络通信开销&#xff0c;提升系统吞吐能力&#xff08;先攒一波&#xff0c;消息以“批”为单位进行处理&#xff09; 生产端&#xff1a;无论是同步发送还是异步发送&#xff0c;Kafka都不会立即就把这条消息发送出…...

最火的服务器托管/名词解释seo

2.搭建双主双从 编号 角色 Ip地址 机器名 1 Master1 192.168.119.131 Hadoop2 2 Slave1 192.168.119.132 Hadoop3 3 Master2 192.168.119.133 Hadoop1 4 Slave2 192.168.119.134 Hadoop4 2.1修改配置文件 修改四台服务器的/etc/my.cnf文件 ①Master1 [mysqld] server-id1 #…...

君和网站建设/优化加速

转载于:https://www.cnblogs.com/fycn01/p/5852304.html...

苏州公司网站建设/浏览器下载安装2023版本

2019独角兽企业重金招聘Python工程师标准>>> GNOME开发人员Bastien Nocera在他最新的博客文章中谈到了他在过去几个星期内在Fedora Linux操作系统的蓝牙堆栈上实施的增强功能。开发者已经为Fedora Linux蓝牙软件包提交的补丁&#xff0c;让用户在GNOME桌面环境中可以…...

wordpress 网页存在哪里/深圳20网络推广

64位的Windows操作系统中能够运行32位的应用程序&#xff0c;主要是由于Windows中提供了WOW64子系统。 1.WOW64子系统 WOW64 (Windows-on-Windows 64-bit)是一个Windows操作系统的子系统, 它为现有的 32 位应用程序提供了 32 位的模拟&#xff0c;可以使大多数 32 位应用程序…...

网站内容维护/短信营销

Description Input 有若干行&#xff0c;每行三个数字 X;Y;Z 代表一组数据&#xff0c;表示立方体的长宽高加 1 Output 第 i 行数据输出Case#i: 第i组数据的答案 Sample Input 2 1 22 2 2Sample Output Case #1: 4Case #2: 15HINT x,y,z<1000 Source 郑州培训D3考试…...

做网站合肥/成人厨师短期培训班

requestAnimationFrame window.requestAnimationFrame() 方法跟 setTimeout 类似&#xff0c;都是推迟某个函数的执行。不同之处在于&#xff0c;setTimeout 必须指定推迟的时间; window.requestAnimationFrame() 则是推迟到浏览器下一次重流时执行&#xff0c;执行完才会进行…...