一、对于一些工控行业的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相关推荐

  1. html 获取电脑ip地址,笔记本自动获取ip地址怎么设置?

    问:笔记本自动获取ip地址怎么设置? 答:笔记本电脑IP地址设置为自动获取的方法,其实并不复杂,只需要找到.打开"网络连接"选项,在该选项下打开"本地连接"或者 ...

  2. 计算机自动配置的ip地址,电脑自动获取IP地址的设置方法(图文)

    在我们使用电脑的过程中,有时候需要根据网络的需求将电脑IP地址设置为自动获取,对网络知识不太了解的朋友遇到此类问题可能不知道怎么去设置,在此小编总结了有关电脑设置自动获取IP地址的相关方法,感兴趣的朋 ...

  3. php查询ip归属地api接口_【php】利用新浪api接口与php获取远程数据的方法,获取IP地址,并获取相应的IP归属地...

    本文与<[Servlet]Javaweb中,利用新浪api接口,获取IP地址,并获取相应的IP归属地>(点击打开链接)为姊妹篇,只是后端编程语言换成了php. 做出同样的效果,打开页面,得 ...

  4. php新浪获取ip接口,【php】利用新浪api接口与php获取远程数据的步骤,获取IP地址,并获取相应的IP归属地...

    [php]利用新浪api接口与php获取远程数据的方法,获取IP地址,并获取相应的IP归属地 本文与<[Servlet]Javaweb中,利用新浪api接口,获取IP地址,并获取相应的IP归属地 ...

  5. 解决win7系统重启后ip丢失问题,即每次电脑重启都要重新设置ip地址,重启后ip地址没了

    解决win7系统重启后ip丢失问题,即每次电脑重启都要重新设置ip地址,重启后ip地址没了 参考文章: (1)解决win7系统重启后ip丢失问题,即每次电脑重启都要重新设置ip地址,重启后ip地址没了 ...

  6. 百度域名解析API+python实现百度云DDNS功能绑定动态公网ip

    背景:前段时间,朋友为了使用NAS服务,开通了电信的动态公网IP,也就是那种公网IP地址会定期变化,重启光猫也会导致IP变化,朋友的水星低端路由器支持花生壳DDNS,去花生壳官网申请服务后能够正常使用 ...

  7. 两台计算机的ip地址怎么配置,同一台电脑如何设置两个IP地址?电脑配置双ip地址图文教程...

    同一台电脑如何设置两个IP地址?很多时候我们电脑在实际运用过程中需要访问两个网段的地址,但是我们只有一个IP,跨网段是不能访问的,现在操作系统有了这个功能,一台电脑可以设置两个网段的ip解决了以前非要 ...

  8. linux获取ip上网,linux dhcp 获取ip地址能上网,设置静态ip地址则不能上网

    今天碰到一个奇怪的问题:安装了一台centos6.6,安装完成后默认dhcp获取ip地址,发现是可以上网的,获取的ip地址为192.168.0.131/24,因为是安装的服务器,所以打算把此地址设置成 ...

  9. android开发工具类之获得WIFI IP地址或者手机网络IP

    有的时候我们需要获得WIFI的IP地址获得手机网络的IP地址,这是一个工具类,专门解决这个问题,这里需要两个权限: <uses-permission android:name="and ...

最新文章

  1. 程序设计类课程教学中创造技法的探索
  2. Nature:首个完全复现人眼的仿生眼问世,港科大造出半球形人工视网膜,感光性能超过人眼460倍...
  3. MySQL数据库引擎详解
  4. [html] 怎样避免让用户看到长时间的白屏?
  5. python中哪里用到缩进_建筑防火中各类门的总结归纳!乙级门?甲级门?都哪里用到了!...
  6. Java/JSP中调用SQL Server存储过程完整示例收藏
  7. python函数装饰器有什么作用请列举说明_你必须学写 Python 装饰器的五个理由
  8. 系统重启-------即java代码重启tomcat!
  9. IDEA Maven 使用教程
  10. 在微博投放广告有哪些优势呢?微博广告推广位置介绍!
  11. 波士顿学院计算机,波士顿学院(Boston College)_快飞留学
  12. 捣鼓openwrt不死bootloader (1)
  13. 百度网盘:未知错误播放失败1000
  14. 计算机科学 vs 计算机技术
  15. 谷歌浏览器默认打开网页设置
  16. js动态修改浏览器title标题
  17. 人人都是产品经理读书笔记
  18. 百度富文本编辑器ueditor在https协议下无法正常插入动态地图
  19. 整数在计算机中的表示
  20. 2018总结以及2019展望

热门文章

  1. Polychain重仓的Findora公链,想带领DeFi脱虚向实
  2. 2021招商银行信用卡Mgeeker竞赛
  3. 【01】什么是 APP?移动 APP 有几种类型?
  4. python阶梯图_Python制图你真的会吗?一文学会如何绘制漂亮的阶梯图
  5. 外挂制作--------过NP技术渐渐
  6. 软件测试慕课版学习总结—第二章
  7. 一个简单的 jQuery 图片裁剪插件----cropper
  8. js 将阿拉伯数字翻译成中文的大写数字
  9. 把对象按照ASCII码排序
  10. 命令控制qq自动申请远程控制