图书馆网站建设的建议惠州百度网络推广

web/2025/10/7 8:19:12/文章来源:
图书馆网站建设的建议,惠州百度网络推广,app设计公司,办公室设计方案Android静态ip设置的坑 Android静态ip设置#xff0c;对于这个功能#xff0c;如果没有接触过#xff0c;会给人感觉是个特别简单的功能#xff0c;直接调用系统的接口即可#xff0c;其实这个功能还是有许多坑的#xff0c;因为谷歌在Android SDK中对相关的API进行非系…Android静态ip设置的坑 Android静态ip设置对于这个功能如果没有接触过会给人感觉是个特别简单的功能直接调用系统的接口即可其实这个功能还是有许多坑的因为谷歌在Android SDK中对相关的API进行非系统层的隐藏打上了hide标签使得上层无法直接调用现有的接口其中隐藏的API包含EthernetManager,IpConfiguration,StaticIpConfiguration等接口其中有的API虽然提供但是关键的接口却被隐藏了。导致本来简单功能变得无比繁琐因此本文就对静态ip设置的坑做个总结为相关开发者提供一个简易的参考。 解决Android静态ip设置的问题可以从两个方面着手 一方面有系统层接口的支持 系统接口也就是直接由系统层提供接口一般是framework jar包上层直接调用接口传参但是需要调整Gradle中的SDK的加载顺序保证framework包正确替换AndroidSDK的jar包否则编译会报错。 另一方面就是App层自己使用java的动态机制 动态机制即java的反射通过反射调用系统隐藏的接口但是这种方式发现在Android6以下的版本是可以的Android6以上的版本虽然设置成功设置里面参数也改了但是重启你会发现已经设置的静态模式会自动切换为动态模式即系统不做数据存储保存只是零时保存在内存中所以你重启以后就被系统还原了参考GitHub分析是高版本谷歌拦截了反射机制不让非系统层修改数据而且这个拦截是在C层进行的特别恶心你绕都绕不过去,不过如果你的应用是Launcher应用的话可以在App层做取巧就是记录用户重启前是否做静态ip的保存如果用户操作了静态ip保存那么App启动的时候在Application的onCreate方法中下发静态ip配置保证重启前静态ip状态和重启后的状态一致就能解决这个问题。以下就静态ip设置从系统层App层两个方面做简要的代码实现分析 1.系统层的实现就是系统提供的接口直接调用思路是先创建EthernetManager对象接着创建StaticIpConfiguration对象再使用StaticIpConfiguration对象创建IpConfiguration对象最后将IpConfiguration设置给EthernetManager中即可代码如下 /*** 项目名称demo* 描述* 静态ip的配置通过framework.jar直调隐藏的系统接口*/ public class FEthernetUtil {private static EthernetManager mEthManager;private static StaticIpConfiguration mStaticIpConfiguration;private static IpConfiguration mIpConfiguration;/*** 描述* param context* param iFace //网口名称* param ip * param gateway* param netmask* param dns1* param dns2* return*/SuppressLint(WrongConstant)public static int setStaticIp(Context context, String iFace, String ip, String gateway, String netmask, String dns1, String dns2) {//获取EthernetManager对象mEthManager (EthernetManager) context.getSystemService(ethernet);if (setStaticIpConfiguration(ip, gateway, netmask, dns1, dns2)) {mEthManager.setConfiguration(iFace, mIpConfiguration);return 0;}return 1;}/*** 描述 初始mIpConfiguration* param ip * param gateway* param netmask* param dns1* param dns2**/private static boolean setStaticIpConfiguration(String ip, String gateway, String netmask, String dns1, String dns2) {Inet4Address inetAddr (Inet4Address) InetAddresses.parseNumericAddress(ip);int prefixLength maskStr2InetMask(netmask);InetAddress gatewayAddr InetAddresses.parseNumericAddress(gateway);InetAddress dnsAddr InetAddresses.parseNumericAddress(dns1);if (null inetAddr || inetAddr.getAddress().toString().isEmpty() || prefixLength 0 || gatewayAddr.toString().isEmpty() || dnsAddr.toString().isEmpty()) {return false;}String dnsStr2 dns2;ArrayListInetAddress dnsAddrs new ArrayListInetAddress();dnsAddrs.add(dnsAddr);if (!dnsStr2.isEmpty()) {dnsAddrs.add(InetAddresses.parseNumericAddress(dns2));}mStaticIpConfiguration new StaticIpConfiguration.Builder().setIpAddress(new LinkAddress(inetAddr, prefixLength)).setGateway(gatewayAddr).setDnsServers(dnsAddrs).build();mIpConfiguration new IpConfiguration();mIpConfiguration.setIpAssignment(IpConfiguration.IpAssignment.STATIC);mIpConfiguration.setProxySettings(IpConfiguration.ProxySettings.NONE);mIpConfiguration.setStaticIpConfiguration(mStaticIpConfiguration);return true;}/*** 描述* 子网掩码解析* param maskStr* return int**/private static 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) {return 0;}String[] ipSegment maskStr.split(\\.);for (String s : ipSegment) {sb new StringBuffer(Integer.toBinaryString(Integer.parseInt(s)));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;} }拿到系统层的jar包跟使用其他jar一样进行gradle依赖配置需要注意是gradle中的jar包加载顺序修改 plugins {id com.android.libraryid org.jetbrains.kotlin.android }...... dependencies {implementation androidx.core:core-ktx:1.8.0api(files(libs/framework.jar))//系统层配置静态ip的jar包 }gradle.projectsEvaluated {tasks.withType(JavaCompile) {SetFile fileSet options.bootstrapClasspath.getFiles();ListFile newFileList new ArrayList()newFileList.add(new File(libs/framework.jar))//加载本地系统jar包newFileList.addAll(fileSet)options.bootstrapClasspath files(newFileList.toArray())} } //调整jar包的顺序 preBuild {doLast {def imlFile file(project.name .iml)println(Change project.name .iml order)try {def parsedXml (new XmlParser()).parse(imlFile)def jdkNode parsedXml.component[1].orderEntry.find { it.type jdk }parsedXml.component[1].remove(jdkNode)def sdkString Android API android.compileSdkVersion.substring(android-.length()) Platformnew groovy.util.Node(parsedXml.component[1], orderEntry, [type: jdk, jdkName: sdkString, jdkType: Android SDK])groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile))} catch (FileNotFoundException e) {}}2.App层的实现App层实现通过反射来操作实现思路其实和系统层实现是一样的逻辑首先需要先获取EthernetManager对象接着创建StaticIpConfiguration对象再根据StaticIpConfiguration对象反射创建IpConfiguration对象和系统层对比App层是使用反射来获取对象而已逻辑是一样的以下是代码实现 class EthernetUtil Inject constructor(ApplicationContext private val context: Context,private val ipConfigRepository: IPConfigRepository,private val guideRepository: GuideRepository ) {/*** 设置以太网静态IP地址** param address ip地址* param mask 子网掩码* param gate 网关* param dns dns*/fun setEthernetStaticIp(address: String,mask: String,gate: String,dns: String,dns2: String): Boolean {d(TAG, setEthernetStaticIp -- ip: $address, mask: $mask, gate $gate, dns: $dns, dns2: $dns2)return try {val ethernetManagerCls Class.forName(android.net.EthernetManager)//获取EthernetManager实例SuppressLint(WrongConstant) val ethManager getApp().getSystemService(ethernet)val ipInfo ipConfigRepository.getDefaultIp()val primaryDNS if (dns.isNullOrEmpty() || dns.isNullOrBlank()) {ipInfo.IPAddress?.PrimaryDNS?.ipAddress} else {dns}val secondaryDNS if (dns2.isNullOrEmpty() || dns2.isNullOrBlank()) {ipInfo.IPAddress?.SecondaryDNS?.ipAddress} else {dns2}//创建StaticIpConfigurationval staticIpConfiguration newStaticIpConfiguration(address, gate, mask, primaryDNS ?: , secondaryDNS ?: )//创建IpConfigurationval ipConfiguration newIpConfiguration(staticIpConfiguration)//获取EthernetManager的setConfiguration()val setConfigurationMethod ethernetManagerCls.getDeclaredMethod(setConfiguration,*arrayOf(NET_ETH_0.javaClass, ipConfiguration.javaClass))//保存静态ip设置saveIpSettings(getApp(), address, mask, gate, dns, dns2)//保存和硬终端一致dns为空也配置//设置静态IPsetConfigurationMethod.invoke(ethManager, NET_ETH_0, ipConfiguration)guideRepository.guideStatus truetrue} catch (e: Exception) {e.printStackTrace()false}}/**** 创建StaticIpConfiguration对象*/Throws(Exception::class)private fun newStaticIpConfiguration(address: String,gate: String,mask: String,dns: String,dns2: String): Any {val staticIpConfigurationCls Class.forName(android.net.StaticIpConfiguration)//实例化StaticIpConfigurationval staticIpConfiguration staticIpConfigurationCls.newInstance()val ipAddress staticIpConfigurationCls.getField(ipAddress)val gateway staticIpConfigurationCls.getField(gateway)val domains staticIpConfigurationCls.getField(domains)val dnsServers staticIpConfigurationCls.getField(dnsServers)//设置ipAddressipAddress[staticIpConfiguration] newLinkAddress(address, mask)//设置网关gateway[staticIpConfiguration] InetAddress.getByName(gate)//设置掩码domains[staticIpConfiguration] mask//设置dns1val dnsList dnsServers[staticIpConfiguration] as ArrayListInetAddressdnsList.add(InetAddress.getByName(dns))//设置dns2dnsList.add(InetAddress.getByName(dns2))return staticIpConfiguration}/*** 获取LinkAddress实例*/Throws(Exception::class)private fun newLinkAddress(address: String, mask: String): Any? {val linkAddressCls Class.forName(android.net.LinkAddress)val linkAddressConstructor linkAddressCls.getDeclaredConstructor(InetAddress::class.java,Int::class.java)d(TAG, 子网掩码参数ip: ${InetAddress.getByName(address)} ${maskStr2InetMask(mask)})return linkAddressConstructor.newInstance(InetAddress.getByName(address),maskStr2InetMask(mask))}/*** 获取IpConfiguration实例*/Throws(Exception::class)private fun newIpConfiguration(staticIpConfiguration: Any): Any {val ipConfigurationCls Class.forName(android.net.IpConfiguration)val ipConfiguration ipConfigurationCls.newInstance()//设置StaticIpConfigurationval staticIpConfigurationField ipConfigurationCls.getField(staticIpConfiguration)staticIpConfigurationField[ipConfiguration] staticIpConfiguration//获取ipAssignment、proxySettings的枚举值val ipConfigurationEnum getIpConfigurationEnum(ipConfigurationCls)//设置ipAssignmentval ipAssignment ipConfigurationCls.getField(ipAssignment)ipAssignment[ipConfiguration] ipConfigurationEnum[IpAssignment.STATIC]//设置proxySettingsval proxySettings ipConfigurationCls.getField(proxySettings)proxySettings[ipConfiguration] ipConfigurationEnum[ProxySettings.STATIC]return ipConfiguration}/*** 获取IpConfiguration的枚举值*/private fun getIpConfigurationEnum(ipConfigurationCls: Class*): MapString, Any {val enumMap: MutableMapString, Any HashMap()val enumClass ipConfigurationCls.declaredClassesfor (enumC in enumClass) {val enumConstants enumC.enumConstants ?: continuefor (enu in enumConstants) {enumMap[enumC.simpleName . enu.toString()] enu}}return enumMap}/*** 保存静态ip设置*/private fun saveIpSettings(context: Context,address: String,mask: String,gate: String,dns: String,dns2: String) {val contentResolver context.contentResolverSettings.Global.putString(contentResolver, ethernet_static_ip, address)Settings.Global.putString(contentResolver, ethernet_static_mask, mask)Settings.Global.putString(contentResolver, ethernet_static_gateway, gate)Settings.Global.putString(contentResolver, ethernet_static_dns1, dns)Settings.Global.putString(contentResolver, ethernet_static_dns2, dns2)}/*** 获取子网掩码长度*/private fun maskStr2InetMask(maskStr: String): Int {var sb: StringBuffervar str: Stringvar inetmask 0var count 0/**** check mask format*/val 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) {d(TAG, subMask is error)return 0}val ipSegment maskStr.split(\\..toRegex()).toTypedArray()for (n in ipSegment.indices) {sb StringBuffer(Integer.toBinaryString(ipSegment[n].toInt()))str sb.reverse().toString()count 0var i 0while (i str.length) {i str.indexOf(1, i)if (i -1) breakcounti}inetmask count}return inetmask}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/88370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

旅游网站网页设计vps 安装 wordpress

md5(string,raw) 所以首先我们要找到一个字符串,这个字符串经过md5得到的16位原始二进制的字符串能帮我们实现sql注入。 我们的目标就是要找一个字符串取32位16进制的md5值里带有276f7227这个字段的,接着就是要看关键的数字部分了,在276f72…

学习网站建设培训公共资源交易中心职能

Vue是一个非常流行的渐进式JavaScript框架,渐进式指的是自底向上,从小组件逐渐向上构成整个项目,渐进式还可以理解为:用什么就拿什么,每个组件只做自己的事,尽可能解耦合。 本节我们将学习简单的Vue实例&a…

企业网站如何更新备案信息用dw可以做网站吗

通过从您的应用程序学习企业APM产品,发现更快,更有效的性能监控。 参加AppDynamics APM导览! 在软件开发中,很少有问题比选择编程语言更具分裂性或部落性。 软件开发人员经常以自己选择的工具来强烈地认同自己,将客观…

纯图片网站源码wish网站应该怎么做

1. 问题描述 给出2n1个非负整数元素的数组,除其中一个数字之外,其他每个数字均出现两次,找到这个数字。 2. 问题示例 给出[1,2,2,1,3,4,3],返回4。 3. 代…

湖南省网站备案时间网络优化这个行业怎么样

考研数学的难度是相对的,它取决于考生的数学基础、备考时间、复习效率和解题技巧等多个因素。从历年的考试情况来看,考研数学确实具有一定的挑战性,主要体现在以下几个方面。 首先是知识覆盖面广,考研数学涵盖了高等数学、线性代…

wordpress.org建站wordpress 收不到邮件

在网络建设及应用中,由于网线最大的传输距离一般为100米,因此布建远距离传输网络的时候不得不使用光纤收发器等中继设备。光纤收发器一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中。那么,光纤收发器该如何使用呢…

深圳网站制作的公司深圳app开发自学编程从哪学起

Java程序员习惯性地用“ getters”和“ setters”来修饰类,这种做法根深蒂固,以至于几乎没有人质疑为什么这样做或是否应该这样做。 最近,我认为最好不要这样做,并且我开始在编写的Java代码中避免使用它。 在这篇博客文章中&#…

h5微信网站开发wordpress js cdn

来源:资本实验室回顾2018年,基于数字化的新技术继续推动着各行的的变革。人工智能、基因技术、物联网、3D打印、区块链……这些技术的应用在改变传统行业游戏规则的同时,给我们提供了关于未来技术应用的想象空间。当然,在看到美好…

网站与云平台区别哪里做网络推广

PHP判断数据库中的记录是否存在的方法,php数据库本文实例讲述了PHP判断数据库中的记录是否存在的方法。分享给大家供大家参考。具体实现代码如下:复制代码 代码如下:$sql"select * from checklist where game_id$gid and task$task and status$stat…

专题网站建设解决方案网络推广主要内容

文章目录 问题描述具体做法代码示例更多条件限制升级 数据库迁移和备份简介数据库迁移数据库备份 问题描述 使用fluttter开发的应用程序发布后,发现数据库有些设计不合理。如何来更新数据库呢? 使用sqflite来处理数据库,但是第一版软件发布后…

在大学里网站建设属于什么专业网站项目建设流程图

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

深圳返利网站开发新余百度网站建设

对于new出来的array sizeof()得到的只是指针大小 对于直接赋值的array sizeof()得到的就是整个数组的大小 memcpy的时候特别注意

集团公司网站源码电视剧排行榜百度搜索风云榜

在数字化浪潮汹涌澎湃的当下,人工智能与操作系统的融合已成为推动科技发展的核心驱动力。华为作为科技领域的先锋,其AI开发框架MindSpore与鸿蒙系统的深度集成备受瞩目,开启了智能生态的新篇章。 华为MindSpore:AI框架的创新先锋…

江苏建设厅网站电话多少物流网站给做软件

上文搭建Umijs环境并创建一个项目 介绍基本操作中 我们构建了一个Umijs环境的环境 但也只创建了一个页面 真正开发来讲 也不可能只创建几个界面这么简单 这里面的创建 还是非常完整的 这里 我创建一个文件夹 主要是做我们的项目目录 然后 我们在终端输入命令 然后 打开目录终…

设计学习网站网站建设的语言与工具

1 珍惜那些处处帮助你的人 国庆假期就要过去了,国庆这几天一直在考虑一个问题(先保留是什么问题),也咨询了几个比较信任的朋友,都没有得到肯定的答案。 回家路上跟了一个大哥哥(陈哥)&#xf…

个人网站建立步骤怎样做网站框架图

问题转化为数学问题,小卧室的地面是长方形,把小卧室的面积转化为求长方形的面积;接着启发学生借 助学具来研究。教材提供了三种探究长方形面积的方法:一是摆一摆,数一数,用 1平方厘米的正方形把 长方形铺满,通过数出一共用了多少个小正方形,求出长方形的面积;二是摆一摆,算一算…

家具制作网站百度收录网站但首页快照不更新

1.在jmeter中计算出接口请求的个数 1175 1172 1172 174 200 416 384 1174 5867 2.计算接口平均响应时间 计算每个接口的请求次数乘以平均响应时间,所有接口相加,然后除以所有接口的数量总和,得到接口的平均响应时间 (1175*18191172*…

设计公司网站需要多少钱网站怎么做咨询

problem luogu-P4460 solution 题面以及数据告诉我们显然是状压 dpdpdp。 设 f(s,i):f(s,i):f(s,i): 经过的点集 sss 最后一次画的点为 iii 的方案数。 直接枚举下一个之前没被画的点 jjj 转移即可。 f(s∣2j,j)←f(s,i)f(s|2^j,j)\leftarrow f(s,i)f(s∣2j,j)←f(s,i)。 …

清丰网站建设公司馆陶网站建设

这是我的第314篇原创文章。 一、引言 对于表格数据,一套完整的机器学习建模流程如下: 针对不同的数据集,有些步骤不适用,其中橘红色框为必要步骤,欢迎大家关注翻看我之前的一些相关文章。前面我介绍了机器学习模型的二…

网站搜索引擎优化怎么做吉林做网站多少钱

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料 那么开启正题 今天分享的是关于vector的题目 1.只出现一次的数字1 136. 只出…