一、对于一些工控行业的Android主板一般都会扩展个以太网接口,也就是可以插网线进行上网;然后在系统设置页面有个以太网菜单可以进行IP、网关等设置,如下:

Android通过反射EthernetManager Api设置以太网为静态IP地址或者动态获取IP_第1张图片
Android通过反射EthernetManager Api设置以太网为静态IP地址或者动态获取IP_第2张图片

二、那怎么通过代码去设置呢?

1、Android系统在Framework层是有提供操作以太网Api的也就是android.net.EthernetManager,但是Google把Api给隐藏了;所以最终你是调用不了的
Android通过反射EthernetManager Api设置以太网为静态IP地址或者动态获取IP_第3张图片
2、那需要怎么操作才能调用到隐藏的Api呢?相信你肯定会立马想到使用反射去调用;对,没错!这里我就是使用的这个方式;当然如果你公司系统层也是自己搞的话就更简单了

三、先假装如果可以调用到android.net.EthernetManager的Api,那么代码应该怎么写呢?

  • 设置静态IP地址, new LinkAddress()报错是因为源码@hide了
    Android通过反射EthernetManager Api设置以太网为静态IP地址或者动态获取IP_第4张图片

  • 设置动态ip地址

Android通过反射EthernetManager Api设置以太网为静态IP地址或者动态获取IP_第5张图片

四、接下来就是通反射去调用了,代码量就比上面多的多了

/** * 文件名:    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");            //创建IpConfiguration            Class<?> ipConfigurationCls = Class.forName("android.net.IpConfiguration");            Object ipConfiguration = ipConfigurationCls.newInstance();            //获取ipAssignment、proxySettings的枚举值            Map<String, Object> ipConfigurationEnum = getIpConfigurationEnum(ipConfigurationCls);            //设置ipAssignment            Field ipAssignment = ipConfigurationCls.getField("ipAssignment");            ipAssignment.set(ipConfiguration, ipConfigurationEnum.get("IpAssignment.DHCP"));            //设置proxySettings            Field proxySettings = ipConfigurationCls.getField("proxySettings");            proxySettings.set(ipConfiguration, ipConfigurationEnum.get("ProxySettings.NONE"));            //获取EthernetManager的setConfiguration()            Method setConfigurationMethod = ethernetManagerCls.getDeclaredMethod("setConfiguration", ipConfiguration.getClass());            //设置动态IP            setConfigurationMethod.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");            //创建StaticIpConfiguration            Object staticIpConfiguration = newStaticIpConfiguration(address, gate, mask, dns);            //创建IpConfiguration            Object ipConfiguration = newIpConfiguration(staticIpConfiguration);            //获取EthernetManager的setConfiguration()            Method setConfigurationMethod = ethernetManagerCls.getDeclaredMethod("setConfiguration", ipConfiguration.getClass());            //保存静态ip设置            saveIpSettings(context, address, mask, gate, dns);            //设置静态IP            setConfigurationMethod.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");        //实例化StaticIpConfiguration        Object staticIpConfiguration = staticIpConfigurationCls.newInstance();        Field ipAddress = staticIpConfigurationCls.getField("ipAddress");        Field gateway = staticIpConfigurationCls.getField("gateway");        Field domains = staticIpConfigurationCls.getField("domains");        Field dnsServers = staticIpConfigurationCls.getField("dnsServers");        //设置ipAddress        ipAddress.set(staticIpConfiguration, newLinkAddress(address, mask));        //设置网关        gateway.set(staticIpConfiguration, InetAddress.getByName(gate));        //设置掩码        domains.set(staticIpConfiguration, mask);        //设置dns        ArrayList<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();        //设置StaticIpConfiguration        Field staticIpConfigurationField = ipConfigurationCls.getField("staticIpConfiguration");        staticIpConfigurationField.set(ipConfiguration, staticIpConfiguration);        //获取ipAssignment、proxySettings的枚举值        Map<String, Object> ipConfigurationEnum = getIpConfigurationEnum(ipConfigurationCls);        //设置ipAssignment        Field ipAssignment = ipConfigurationCls.getField("ipAssignment");        ipAssignment.set(ipConfiguration, ipConfigurationEnum.get("IpAssignment.STATIC"));        //设置proxySettings        Field 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;    }}
  • 使用只需调用方法即可:
//设置静态ipEthernetUtil.setEthernetStaticIp(context, "192.168.5.33", "255.255.255.0", "192.168.5.1", "8.8.8.8");//设置动态获取ipEthernetUtil.setDynamicIp(context)

最后:这个代码本人在Android7.0的原生系统验证是可以使用的,有需要的可以使用试试EthernetUtil源码下载地址

  • 最后在推荐个好用的系统源码查看网址吧:Android 系统源码在线查看

更多相关文章

  1. 20个经典Android游戏源码下载地址(持续更新~)
  2. Android 开源项目地址备份(持续更新。。。)
  3. android API文档下载地址
  4. 自定义progressBar显示静态数据
  5. 关于android Ip地址的获取
  6. android 通过地址获取经纬度
  7. RK3288 android7.1 蓝牙MAC地址获取
  8. Android获取局域网所有设备的ip地址
  9. 我的Android进阶之旅------>android api的源代码下载地址

随机推荐

  1. 【Android】Uri、UriMatcher、ContentUri
  2. Android之NDK开发
  3. A​n​d​r​o​i​d​体​系​结​构
  4. Android(安卓)的启动流程-转
  5. Android的几个特点简述
  6. 介绍自己的一个Android插桩热修复框架项
  7. Android(安卓)studio模拟器 Intel HAXM I
  8. TableLayout(表格布局)
  9. android的Sprite,TiledLayer,LayerManage
  10. ANDROID资源文件