Android通过反射EthernetManager Api设置以太网为静态IP地址或者动态获取IP
一、对于一些工控行业的Android主板一般都会扩展个以太网接口,也就是可以插网线进行上网;然后在系统设置页面有个以太网菜单可以进行IP、网关等设置,如下:
二、那怎么通过代码去设置呢?
1、Android系统在Framework层是有提供操作以太网Api的也就是android.net.EthernetManager
,但是Google把Api给隐藏了;所以最终你是调用不了的
2、那需要怎么操作才能调用到隐藏的Api呢?相信你肯定会立马想到使用反射去调用;对,没错!这里我就是使用的这个方式;当然如果你公司系统层也是自己搞的话就更简单了
三、先假装如果可以调用到android.net.EthernetManager
的Api,那么代码应该怎么写呢?
设置静态IP地址, new LinkAddress()报错是因为源码@hide了
设置动态ip地址
四、接下来就是通反射去调用了,代码量就比上面多的多了
/*** 文件名: EthernetUtil* 创建时间: 2020/8/21 on 11:22* 描述: TODO 设置以太网静态ip 动态ip地址** @author 阿钟*/public class EthernetUtil {/*** 设置以太网动态获取IP*/public static boolean setDynamicIp(Context context) {try {Class<?> ethernetManagerCls = Class.forName("android.net.EthernetManager");//获取EthernetManager实例Object ethManager = context.getSystemService("ethernet");//创建IpConfigurationClass<?> ipConfigurationCls = Class.forName("android.net.IpConfiguration");Object ipConfiguration = ipConfigurationCls.newInstance();//获取ipAssignment、proxySettings的枚举值Map<String, Object> ipConfigurationEnum = getIpConfigurationEnum(ipConfigurationCls);//设置ipAssignmentField ipAssignment = ipConfigurationCls.getField("ipAssignment");ipAssignment.set(ipConfiguration, ipConfigurationEnum.get("IpAssignment.DHCP"));//设置proxySettingsField proxySettings = ipConfigurationCls.getField("proxySettings");proxySettings.set(ipConfiguration, ipConfigurationEnum.get("ProxySettings.NONE"));//获取EthernetManager的setConfiguration()Method setConfigurationMethod = ethernetManagerCls.getDeclaredMethod("setConfiguration", ipConfiguration.getClass());//设置动态IPsetConfigurationMethod.invoke(ethManager, ipConfiguration);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 设置以太网静态IP地址** @param address ip地址* @param mask 子网掩码* @param gate 网关* @param dns dns*/public static boolean setEthernetStaticIp(Context context, String address, String mask, String gate, String dns) {try {Class<?> ethernetManagerCls = Class.forName("android.net.EthernetManager");//获取EthernetManager实例Object ethManager = context.getSystemService("ethernet");//创建StaticIpConfigurationObject staticIpConfiguration = newStaticIpConfiguration(address, gate, mask, dns);//创建IpConfigurationObject ipConfiguration = newIpConfiguration(staticIpConfiguration);//获取EthernetManager的setConfiguration()Method setConfigurationMethod = ethernetManagerCls.getDeclaredMethod("setConfiguration", ipConfiguration.getClass());//保存静态ip设置saveIpSettings(context, address, mask, gate, dns);//设置静态IPsetConfigurationMethod.invoke(ethManager, ipConfiguration);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 获取StaticIpConfiguration实例*/private static Object newStaticIpConfiguration(String address, String gate, String mask, String dns) throws Exception {Class<?> staticIpConfigurationCls = Class.forName("android.net.StaticIpConfiguration");//实例化StaticIpConfigurationObject staticIpConfiguration = staticIpConfigurationCls.newInstance();Field ipAddress = staticIpConfigurationCls.getField("ipAddress");Field gateway = staticIpConfigurationCls.getField("gateway");Field domains = staticIpConfigurationCls.getField("domains");Field dnsServers = staticIpConfigurationCls.getField("dnsServers");//设置ipAddressipAddress.set(staticIpConfiguration, newLinkAddress(address, mask));//设置网关gateway.set(staticIpConfiguration, InetAddress.getByName(gate));//设置掩码domains.set(staticIpConfiguration, mask);//设置dnsArrayList<InetAddress> dnsList = (ArrayList<InetAddress>) dnsServers.get(staticIpConfiguration);dnsList.add(InetAddress.getByName(dns));return staticIpConfiguration;}/*** 获取LinkAddress实例*/private static Object newLinkAddress(String address, String mask) throws Exception {Class<?> linkAddressCls = Class.forName("android.net.LinkAddress");Constructor<?> linkAddressConstructor = linkAddressCls.getDeclaredConstructor(InetAddress.class, int.class);return linkAddressConstructor.newInstance(InetAddress.getByName(address), getPrefixLength(mask));}/*** 获取IpConfiguration实例*/private static Object newIpConfiguration(Object staticIpConfiguration) throws Exception {Class<?> ipConfigurationCls = Class.forName("android.net.IpConfiguration");Object ipConfiguration = ipConfigurationCls.newInstance();//设置StaticIpConfigurationField staticIpConfigurationField = ipConfigurationCls.getField("staticIpConfiguration");staticIpConfigurationField.set(ipConfiguration, staticIpConfiguration);//获取ipAssignment、proxySettings的枚举值Map<String, Object> ipConfigurationEnum = getIpConfigurationEnum(ipConfigurationCls);//设置ipAssignmentField ipAssignment = ipConfigurationCls.getField("ipAssignment");ipAssignment.set(ipConfiguration, ipConfigurationEnum.get("IpAssignment.STATIC"));//设置proxySettingsField proxySettings = ipConfigurationCls.getField("proxySettings");proxySettings.set(ipConfiguration, ipConfigurationEnum.get("ProxySettings.STATIC"));return ipConfiguration;}/*** 获取IpConfiguration的枚举值*/private static Map<String, Object> getIpConfigurationEnum(Class<?> ipConfigurationCls) {Map<String, Object> enumMap = new HashMap<>();Class<?>[] enumClass = ipConfigurationCls.getDeclaredClasses();for (Class<?> enumC : enumClass) {Object[] enumConstants = enumC.getEnumConstants();if (enumConstants == null) continue;for (Object enu : enumConstants) {enumMap.put(enumC.getSimpleName() + "." + enu.toString(), enu);}}return enumMap;}/*** 保存静态ip设置*/private static void saveIpSettings(Context context, String address, String mask, String gate, String dns) {ContentResolver contentResolver = context.getContentResolver();Settings.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);}/*** 获取长度*/private static int getPrefixLength(String mask) {String[] strs = mask.split("\\.");int count = 0;for (String str : strs) {if (str.equals("255")) {++count;}}return count * 8;}
}
- 使用只需调用方法即可:
//设置静态ip
EthernetUtil.setEthernetStaticIp(context, "192.168.5.33", "255.255.255.0", "192.168.5.1", "8.8.8.8");
//设置动态获取ip
EthernetUtil.setDynamicIp(context)
最后:这个代码本人在Android7.0的原生系统验证是可以使用的,有需要的可以使用试试EthernetUtil源码下载地址
Android通过反射EthernetManager Api设置以太网为静态IP地址或者动态获取IP相关推荐
- html 获取电脑ip地址,笔记本自动获取ip地址怎么设置?
问:笔记本自动获取ip地址怎么设置? 答:笔记本电脑IP地址设置为自动获取的方法,其实并不复杂,只需要找到.打开"网络连接"选项,在该选项下打开"本地连接"或者 ...
- 计算机自动配置的ip地址,电脑自动获取IP地址的设置方法(图文)
在我们使用电脑的过程中,有时候需要根据网络的需求将电脑IP地址设置为自动获取,对网络知识不太了解的朋友遇到此类问题可能不知道怎么去设置,在此小编总结了有关电脑设置自动获取IP地址的相关方法,感兴趣的朋 ...
- php查询ip归属地api接口_【php】利用新浪api接口与php获取远程数据的方法,获取IP地址,并获取相应的IP归属地...
本文与<[Servlet]Javaweb中,利用新浪api接口,获取IP地址,并获取相应的IP归属地>(点击打开链接)为姊妹篇,只是后端编程语言换成了php. 做出同样的效果,打开页面,得 ...
- php新浪获取ip接口,【php】利用新浪api接口与php获取远程数据的步骤,获取IP地址,并获取相应的IP归属地...
[php]利用新浪api接口与php获取远程数据的方法,获取IP地址,并获取相应的IP归属地 本文与<[Servlet]Javaweb中,利用新浪api接口,获取IP地址,并获取相应的IP归属地 ...
- 解决win7系统重启后ip丢失问题,即每次电脑重启都要重新设置ip地址,重启后ip地址没了
解决win7系统重启后ip丢失问题,即每次电脑重启都要重新设置ip地址,重启后ip地址没了 参考文章: (1)解决win7系统重启后ip丢失问题,即每次电脑重启都要重新设置ip地址,重启后ip地址没了 ...
- 百度域名解析API+python实现百度云DDNS功能绑定动态公网ip
背景:前段时间,朋友为了使用NAS服务,开通了电信的动态公网IP,也就是那种公网IP地址会定期变化,重启光猫也会导致IP变化,朋友的水星低端路由器支持花生壳DDNS,去花生壳官网申请服务后能够正常使用 ...
- 两台计算机的ip地址怎么配置,同一台电脑如何设置两个IP地址?电脑配置双ip地址图文教程...
同一台电脑如何设置两个IP地址?很多时候我们电脑在实际运用过程中需要访问两个网段的地址,但是我们只有一个IP,跨网段是不能访问的,现在操作系统有了这个功能,一台电脑可以设置两个网段的ip解决了以前非要 ...
- linux获取ip上网,linux dhcp 获取ip地址能上网,设置静态ip地址则不能上网
今天碰到一个奇怪的问题:安装了一台centos6.6,安装完成后默认dhcp获取ip地址,发现是可以上网的,获取的ip地址为192.168.0.131/24,因为是安装的服务器,所以打算把此地址设置成 ...
- android开发工具类之获得WIFI IP地址或者手机网络IP
有的时候我们需要获得WIFI的IP地址获得手机网络的IP地址,这是一个工具类,专门解决这个问题,这里需要两个权限: <uses-permission android:name="and ...
最新文章
- 程序设计类课程教学中创造技法的探索
- Nature:首个完全复现人眼的仿生眼问世,港科大造出半球形人工视网膜,感光性能超过人眼460倍...
- MySQL数据库引擎详解
- [html] 怎样避免让用户看到长时间的白屏?
- python中哪里用到缩进_建筑防火中各类门的总结归纳!乙级门?甲级门?都哪里用到了!...
- Java/JSP中调用SQL Server存储过程完整示例收藏
- python函数装饰器有什么作用请列举说明_你必须学写 Python 装饰器的五个理由
- 系统重启-------即java代码重启tomcat!
- IDEA Maven 使用教程
- 在微博投放广告有哪些优势呢?微博广告推广位置介绍!
- 波士顿学院计算机,波士顿学院(Boston College)_快飞留学
- 捣鼓openwrt不死bootloader (1)
- 百度网盘:未知错误播放失败1000
- 计算机科学 vs 计算机技术
- 谷歌浏览器默认打开网页设置
- js动态修改浏览器title标题
- 人人都是产品经理读书笔记
- 百度富文本编辑器ueditor在https协议下无法正常插入动态地图
- 整数在计算机中的表示
- 2018总结以及2019展望