安卓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中自由切换动态,静态方法,直接把系统jar-api给他搞了半天搞不定,只有在系统里给他实现一个接口,方法如下: Index: packages/apps/Settings/AndroidManifest.xml--- packages/apps/Settings/AndroidManifes…...
初级数据结构(五)——树和二叉树的概念
文中代码源文件已上传:数据结构源码 <-上一篇 初级数据结构(四)——队列 | NULL 下一篇-> 1、树结构(Tree) 1.1、树结构的特点 自然界中的树由根部开始向上生长,随机长出分支&…...
pdf读取内容缺失(漏字/文字丢失)问题
项目中遇到pdf文件漏字,由于文件涉密,不能展示,简单描述一下: 比如原pff中 姓名:张三 读取结果中:空白:张三 即:原文件说是银行出具的打款证明,银行内部设置了文件权限&a…...
c#面试基础语法——现有⼀个整数number,请写⼀个⽅法判断这个整数是否是2的N次⽅
1.number%20 取余(取模)只能判断number是不是2的倍数但不一定是2的N次方,如:6%20但是他并不是2的N次方 2.(number&(number-1))0 原理:如果number是2的N次方则表示2进制位只有一位是1。如:2 (…...

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

YOLOv8改进 | 2023主干篇 | 替换LSKNet遥感目标检测主干 (附代码+修改教程+结构讲解)
一、本文介绍 本文给大家带来的改进内容是LSKNet(Large Kernel Selection, LK Selection),其是一种专为遥感目标检测设计的网络架构,其核心思想是动态调整其大的空间感受野,以更好地捕捉遥感场景中不同对象的范围上下…...
【工具】VUE 前端列表拖拽功能代码
【工具】VUE 前端列表拖拽功能代码 使用组件 yarn add sortablejs --save Sortable.js中文网 (sortablejs.com) 以下代码只是举个例子, 大家可以举一反三去实现各自的业务功能 <template><div><el-button type"primary" click"切换…...

人工智能与量子计算:开启未知领域的智慧之旅
导言 人工智能与量子计算的结合是科技领域的一场创新盛宴,引领我们进入了探索未知领域的新时代。本文将深入研究人工智能与量子计算的交汇点,探讨其原理、应用以及对计算领域的深远影响。 量子计算的崛起为人工智能领域注入了新的活力,开启了…...
2023了,前端实现AI电子秤思路分析
前景小知识: 这几年ai这个话题非常火爆,笔者从事零售行业软件开发也接到了新需求,希望实现ai电子秤,老规矩,先看需求 举个栗子: 或许,你已经留意到,当你在某些大型超市超市或生鲜类…...

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服务框架,我们可以利用它快速搭建一个服务,对外提供接口,其他人可以轻松调用我们的服务。这对算法工程师来说比较关键,我们通常不擅长搞开发…...

Tomcat-安装部署(源码包安装)
一、简介 Tomcat 是由 Apache 开发的一个 Servlet 容器,实现了对 Servlet 和 JSP 的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 简单来说,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得到其子孙窗口的列表,列表元素统一为QWidget*,遍历列表元素,每个元素调用installEventFilter,过滤QEvent::FocusIn和QEvent::FocusOut事件,做相应处理即可: QWidget* parent; QLis…...

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

深度学习基本概念
1.全连接层 全连接层就是该层的所有节点与输入节点全部相连,如图所 示。假设输入节点为X1, X 2, X 3,输出节点为 Y 1, Y 2, Y 3, Y 4。令 矩阵 W 代表全连接层的权重, W 12也就代表 …...

2023年最详细的:本地Linux服务器安装宝塔面板,并内网穿透实现公网远程登录
📚📚 🏅我是默,一个在CSDN分享笔记的博主。📚📚 🌟在这里,我要推荐给大家我的专栏《Linux》。🎯🎯 🚀无论你是编程小白,还是有一…...

基于ssm金旗帜文化培训学校网站的设计与开发论文
摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对培训学校展示信息管理混乱,出错率高,信息安全…...
【Java】猜数字小游戏
规则 游戏开始随机生成4位数字符串,每个数字从0到9各不相同,比如0123玩家10次猜数机会,输入4位数字符串,每个数字从0到9各不相同游戏判断玩家输入与所猜谜底数,给出结果nAnB,A表示位置和数字都猜对的个数&…...

汽车EDI:Chrysler EDI项目案例
菲亚特克莱斯勒汽车Fiat Chrysler Automobiles(FCA)是一家全球性汽车制造商,主营产品包括轿车、SUV、皮卡车、商用车和豪华车等多种车型。其旗下品牌包括菲亚特、克莱斯勒、道奇、Jeep、Ram、阿尔法罗密欧和玛莎拉蒂等。 Chrysler通过EDI来优化订单处理、交付通知、…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...

goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...