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

android13(T) 以太网设置工具类

13 版本的以太网设置和以前版本有所变动,在 AS 中就能直接调用对应 API

将 build.gradle 版本修改 compileSdkVersion 31, 即可直接调用 EthernetManager 相关,

设置静态等方法可以通过反射调用设置。

以下是核心设置静态和动态参数工具类,界面大家可以自由发挥,

以太网电源开关和你们驱动协商写个节点啥的都ok

import android.content.ContentResolver;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.EthernetManager;
import android.net.IpConfiguration;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.RouteInfo;
import android.net.StaticIpConfiguration;
import android.provider.Settings;
import android.provider.Settings.System;
import android.text.TextUtils;
import android.util.Log;import java.io.FileOutputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;import static android.content.Context.CONNECTIVITY_SERVICE;public class EthernetUtil {private static final String TAG = "EthernetUtil";public static final String IS_ETHERNET_OPEN = "isEthernetOpen";public static final String IS_ETHERNET_STATUC_OPEN = "isEthernetStaticOpen";public static final String ETHERNET_STATIC_DNS1 = "ethernet_static_dns1";public static final String ETHERNET_STATIC_DNS2 = "ethernet_static_dns2";public static final String ETHERNET_STATIC_GATEWAY = "ethernet_static_gateway";public static final String ETHERNET_STATIC_IP = "ethernet_static_ip";public static final String ETHERNET_STATIC_NETMASK = "ethernet_static_netmask";EthernetManager mEthernetManager;Context mContext;private static EthernetUtil ethernetUtil;public static EthernetUtil getInstance() {if (ethernetUtil == null) {ethernetUtil = new EthernetUtil();}return ethernetUtil;}public void setContext(Context context) {mContext = context;}public void saveEthernetConfig() {boolean isOpen = isEthernetEnabled();boolean isStatic = isStaticEnabled();Log.d(TAG, "saveEthernetConfig isOpen=" + isOpen + " isStatic=" + isStatic);mEthernetManager = (EthernetManager) mContext.getSystemService(Context.ETHERNET_SERVICE);IpConfiguration mIpConfiguration = new IpConfiguration();StaticIpConfiguration.Builder staticIpConfiguration = new StaticIpConfiguration.Builder();ContentResolver mContentResolver = mContext.getContentResolver();if (isOpen) {if (isStatic) {try {String ip = System.getString(mContentResolver, ETHERNET_STATIC_IP);String gateWay = System.getString(mContentResolver, ETHERNET_STATIC_GATEWAY);String netMask = System.getString(mContentResolver,  ETHERNET_STATIC_NETMASK);String dns1 = System.getString(mContentResolver,  ETHERNET_STATIC_DNS1);String dns2 = System.getString(mContentResolver,  ETHERNET_STATIC_DNS2);staticIpConfiguration.setIpAddress(new LinkAddress(InetAddress.getByName(ip),getNetMaskInt(netMask)));staticIpConfiguration.setDomains(netMask);staticIpConfiguration.setGateway(InetAddress.getByName(gateWay));ArrayList<InetAddress> dnsAddresses = new ArrayList<>();dnsAddresses.add((Inet4Address) InetAddress.getByName(TextUtils.isEmpty(dns1) ? "8.8.8.8" : dns1));dnsAddresses.add((Inet4Address) InetAddress.getByName(TextUtils.isEmpty(dns2) ? "114.114.114.114" : dns2));staticIpConfiguration.setDnsServers(dnsAddresses);} catch (Exception e) {e.printStackTrace();}Log.d(TAG, "IpAssignment.STATIC =" + IpConfiguration.IpAssignment.STATIC);mIpConfiguration.setIpAssignment(IpConfiguration.IpAssignment.STATIC);mIpConfiguration.setProxySettings(IpConfiguration.ProxySettings.STATIC);mIpConfiguration.setStaticIpConfiguration(staticIpConfiguration.build());} else {mIpConfiguration.setIpAssignment(IpConfiguration.IpAssignment.DHCP);mIpConfiguration.setProxySettings(IpConfiguration.ProxySettings.NONE);mIpConfiguration.setStaticIpConfiguration(null);Log.d(TAG, "IpAssignment.DHCP =" + IpConfiguration.IpAssignment.DHCP);}setConfiguration("eth0", mIpConfiguration);setEthernetEnabled(true);Log.d(TAG, "setEthernet true");} else {setEthernetEnabled(false);Log.d(TAG, "setEthernet false");}}private void setEthernetEnabled(boolean enabled) {try {Class<? extends EthernetManager> c = mEthernetManager.getClass();Method method = c.getMethod("setEthernetEnabled", boolean.class);EthernetManager tempManager = mEthernetManager;method.setAccessible(true);Log.e(TAG, "get setEthernetEnabled Method: " + (method == null));method.invoke(tempManager, enabled);} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {Log.e(TAG, "getDeclaredMethod: " + e.getMessage());}}private void setConfiguration(String iface, IpConfiguration config) {try {Class<? extends EthernetManager> c = mEthernetManager.getClass();Method method = c.getMethod("setConfiguration", String.class, IpConfiguration.class);EthernetManager tempManager = mEthernetManager;method.setAccessible(true);Log.e(TAG, "get setConfiguration Method: " + (method == null));method.invoke(tempManager, iface, config);} catch (Exception e) {Log.e(TAG, "getDeclaredMethod: " + e.getMessage());}}private String interMask2String(int prefixLength) {String netMask = null;int inetMask = prefixLength;int part = inetMask / 8;int remainder = inetMask % 8;int sum = 0;for (int i = 8; i > 8 - remainder; i--) {sum = sum + (int) Math.pow(2, i - 1);}if (part == 0) {netMask = sum + ".0.0.0";} else if (part == 1) {netMask = "255." + sum + ".0.0";} else if (part == 2) {netMask = "255.255." + sum + ".0";} else if (part == 3) {netMask = "255.255.255." + sum;} else if (part == 4) {netMask = "255.255.255.255";}return netMask;}public boolean isValidIpAddress(String value) {int start = 0;int end = value.indexOf('.');int numBlocks = 0;while (start < value.length()) {if (-1 == end) {end = value.length();}try {int block = Integer.parseInt(value.substring(start, end));if ((block > 255) || (block < 0)) {Log.w(TAG, "isValidIpAddress() : invalid 'block', block = " + block);return false;}} catch (NumberFormatException e) {Log.w(TAG, "isValidIpAddress() : e = " + e);return false;}numBlocks++;start = end + 1;end = value.indexOf('.', start);}return numBlocks == 4;}private int getNetMaskInt(String netMask) {Log.d(TAG, "netMask =" + netMask);StringBuffer sbf;String str;int prefixLength = 0, count = 0;String[] split = netMask.split("\\.");for (int n = 0; n < split.length; n++) {sbf = toBin(Integer.parseInt(split[n]));str = sbf.reverse().toString();//Log.e("net", split[n] + "===" + str);count = 0;for (int i = 0; i < str.length(); i++) {i = str.indexOf('1', i);if (i == -1) {break;}count++;}prefixLength += count;}return prefixLength;}private StringBuffer toBin(int x) {StringBuffer result = new StringBuffer();result.append(x % 2);x /= 2;while (x > 0) {result.append(x % 2);x /= 2;}return result;}public String getSaveIp(){return Settings.System.getString(mContext.getContentResolver(), ETHERNET_STATIC_IP);}public String getSaveNetMask(){return Settings.System.getString(mContext.getContentResolver(), ETHERNET_STATIC_NETMASK);}public String getSaveGateway(){return Settings.System.getString(mContext.getContentResolver(), ETHERNET_STATIC_GATEWAY);}public String getSaveDns1(){return Settings.System.getString(mContext.getContentResolver(), ETHERNET_STATIC_DNS1);}public String getSaveDns2(){return Settings.System.getString(mContext.getContentResolver(), ETHERNET_STATIC_DNS2);}public boolean isEthernetEnabled() {return Settings.System.getInt(mContext.getContentResolver(), IS_ETHERNET_OPEN, 0) == 1;}public boolean isStaticEnabled() {return Settings.System.getInt(mContext.getContentResolver(), IS_ETHERNET_STATUC_OPEN, 0) == 1;}public void setEthernetEnabled(boolean flag) {Settings.System.putInt(mContext.getContentResolver(), IS_ETHERNET_OPEN, flag ? 1 : 0);}public void setStaticEnabled(boolean flag) {Settings.System.putInt(mContext.getContentResolver(), IS_ETHERNET_STATUC_OPEN, flag ? 1 : 0);}}

相关文章:

android13(T) 以太网设置工具类

13 版本的以太网设置和以前版本有所变动&#xff0c;在 AS 中就能直接调用对应 API 将 build.gradle 版本修改 compileSdkVersion 31, 即可直接调用 EthernetManager 相关&#xff0c; 设置静态等方法可以通过反射调用设置。 以下是核心设置静态和动态参数工具类&#xff0c…...

电脑报错提示xinput1_3.dll缺失怎么办?xinput1_3.dll丢失的简单恢复方案

今天&#xff0c;我将为大家分享一个与我们日常工作息息相关的话题——xinput1_3.dll丢失的4种解决方法。在我们的日常工作和生活中&#xff0c;电脑出现问题是常有的事&#xff0c;而xinput1_3.dll丢失则是其中较为常见的一种问题。那么&#xff0c;什么是xinput1_3.dll?它为…...

unity 之参数类型之引用类型

文章目录 引用类型引用类型与值类型的差异 引用类型 在Unity中&#xff0c;引用类型是指那些在内存中存储对象引用的数据类型。以下是在Unity中常见的引用类型的介绍&#xff1a; 节点&#xff08;GameObject&#xff09;&#xff1a; 在Unity中&#xff0c;游戏对象&#xff…...

SpringBoot自定义工具类—基于定时器完成文件清理功能

直接复制粘贴既可&#xff01;&#xff01; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.io.File; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneOff…...

安卓设置混淆后,gson报错解决方法

一&#xff0c;设置开启混淆release {minifyEnabled truezipAlignEnabled trueshrinkResources trueproguardFiles getDefaultProguardFile(proguard-android-optimize.txt), proguard-rules.pro } 二&#xff0c;混淆的文件中&#xff0c;对gson相关类不进行混淆&#xff0c;否…...

WPF实战项目十四(API篇):登录注册接口

1、新建UserDto.cs public class UserDto : BaseDto{private string userName;/// <summary>/// 用户名/// </summary>public string UserName{get { return userName; }set { userName value;OnPropertyChanged(); }}private string account;/// <summary>…...

10个免费PPT下载资源网站分享

PPT超级市场https://pptsupermarket.com/ PPT超级市场是一个完全免费的PPT模板下载网站&#xff0c;不需要注册登录&#xff0c;点击下载就能直接使用。 叮当设计https://www.dingdangsheji.com/ 叮当设计是一个完全免费的PPT模板下载网站&#xff0c;每一套PPT的质量都很高。除…...

SpringCloud入门——微服务调用的方式 RestTemplate的使用 使用nacos的服务名初步(Ribbon负载均衡)

目录 引出微服务之间的调用几种调用方法spring提供的组件 RestTemplate的使用导入依赖生产者模块单个配置的情况多个配置的情况没加.yaml的报错【报错】两个同名配置【细节】 完整代码config配置主启动类controller层 消费者模块进行配置restTemplate配置类controller层 使用na…...

Python基础篇(16):python中__new__方法

一、__new__方法的定义 __new__() 方法是一种负责创建 类实例 的 静态方法 二、__new__方法的作用 在内存中为对象分配空间返回对象的引用 三、__new__方法的使用 创建对象时自动调用__new__方法&#xff0c;并且是在__init__初始化方法之前被调用Python解释器获得对象的引…...

linux并发服务器 —— 文件IO相关函数(三)

文件IO 以内存为主体&#xff0c;看待输入输出&#xff1b; 标准C库IO函数带有缓冲区&#xff0c;效率较高&#xff1b; 虚拟地址空间 虚拟地址空间是不存在的&#xff0c;一个应用程序运行期间对应一个虚拟地址空间&#xff1b; 虚拟地址空间的大小由CPU决定&#xff0c;位…...

matlab使用教程(27)—微分代数方程(DAE)求解

1.什么是微分代数方程&#xff1f; 微分代数方程是一类微分方程&#xff0c;其中一个或多个因变量导数未出现在方程中。方程中出现的未包含其导数的变量称为代数变量&#xff0c;代数变量的存在意味着您不能将这些方程记为显式形式 y ′ f t , y 。相反&#xff0c;您可以…...

vue3组合式api <script setup> props 父子组件的写法

父组件传入子组个的变量&#xff0c; 子组件是无法直接修改的&#xff0c; 只能通过 emit的方式&#xff0c; 让父组件修改&#xff0c; 之后子组件更新 <template><div class"parent">我是父组件<son :msg"msg" :obj"obj" chan…...

Compose - 自定义作用域限制函数

一、概念 在 Compose 中对于作用域的应用特别多。比如 weight 修饰符只能用在 RowScope 或者 ColumnScope 作用域中&#xff0c;item 组件只能用在 LazyListScope 作用域中。 标准库中的作用域函数如 apply()、let() 会以不同方式持有和返回上下文对象&#xff0c;调用它们时 L…...

【Flutter】Flutter 使用 photo_view 实现图片查看器

【Flutter】Flutter 使用 photo_view 实现图片查看器 文章目录 一、前言二、photo_view 简介三、安装与基本使用四、使用 PhotoViewGallery 展示多张图片五、完整示例六、总结 一、前言 大家好&#xff0c;我是小雨青年&#xff0c;今天我要给大家介绍一个在 Flutter 中非常实…...

电脑组装教程分享!

案例&#xff1a;如何自己组装电脑&#xff1f; 【看到身边的小伙伴组装一台自己的电脑&#xff0c;我也想试试。但是我对电脑并不是很熟悉&#xff0c;不太了解具体的电脑组装步骤&#xff0c;求一份详细的教程&#xff01;】 电脑已经成为我们日常生活中不可或缺的一部分&a…...

【云原生之Docker实战】使用Docker部署flatnotes笔记工具

【云原生之Docker实战】使用Docker部署flatnotes笔记工具 一、flatnotes介绍1.1 flatnotes简介1.2 flatnotes特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载flatnotes…...

XSSchallenge1-20

test1 第一题直接在test插入XSS代码即可 test2 第二关对内容进行”“包裹 这里可以采用”>来绕过 test3 代码审计发现这里用了htmlspecialchars函数&#xff0c;这个函数对<>和’ “等进行了转义&#xff0c;这里可以用事件来绕过 test4 这里用了str_replace&a…...

centos 7的超详细安装教程

打开虚拟机&#xff0c;创建一个新电脑 我们选择经典&#xff0c;然后选择下一步 我们选择稍后安装&#xff0c;我们在后面进行改设备 因为centos系统是linux系统的一个版本&#xff0c;所有我们选择linux&#xff0c;版本选择centos 7 64位&#xff0c;然后就是点击下一步 这一…...

代码随想录算法训练营第五十二天 | 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组

代码随想录算法训练营第五十二天 | 300.最长递增子序列&#xff0c;674. 最长连续递增序列&#xff0c;718. 最长重复子数组 300.最长递增子序列674. 最长连续递增序列718. 最长重复子数组 300.最长递增子序列 题目链接 视频讲解 给你一个整数数组 nums &#xff0c;找到其中最…...

计算机图形软件(三)6-6 小结

小结 这一章概括了图形软件系统的主要特点。某些软件系统&#xff0c;如 CAD 软件包和绘图程序&#xff0c;其为特定应用而设计。另外一些软件系统则提供可以在诸如 C的程序设计语言中使用的一个通用图形子程序库&#xff0c;用来为任何应用生成图片。 ISO和AN…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...