简单记录下 Android 5.1 系统以太网的 IP 设置方法。(到5.1的版本为止,与以太网相关的 API 都是隐藏起来的,有@hide注解,需要通过反射调用,或者引用没有@hide注解的 android.jar 文件,可以使用编译源码生成的 out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar)
EthernetManager 获取
EthernetManager 使用单例模式,可以通过 Context 的 getSystemService() 方法获取:
1 | private EthernetManager getEthernetManager(Context context) { |
Context.ETHERNET_SERVICE 也是有@hide注解的,可以定义一个常量替代:
1 | private static final String ETHERNET_SERVICE = "ethernet"; |
DHCP
以太网的 IP 设置通过 IpConfiguration 来配置,其中的 ipAssignment 变量决定 IP 的分配方式,值可以为 IpAssignment.DHCP、 IpAssignment.STATIC、 IpAssignment.UNASSIGNED,分别为动态 IP、静态 IP、未指定。IpConfiguration 通过 EthernetManager 的 getConfiguration() 获取,通过 setConfiguration() 使配置生效。设置以太网使用 DHCP 方式获取 IP 的代码如下:
1 | /** 设置网线使用DHCP方式获取IP */ |
静态 IP
静态 IP 方式则稍微复杂一点,静态 IP 方式需要指定 IP 地址、子网掩码、网关地址、DNS 服务器地址,这几项信息不对会造成设置失败。这些信息的通过 StaticIpConfiguration 设置,StaticIpConfiguration 通过 IpConfiguration 获取:
1 | StaticIpConfiguration staticIpConfiguration = configuration.getStaticIpConfiguration(); |
首先修改 IpConfiguration 的 ipAssignment 值为 IpAssignment.STATIC,然后设置静态 IP 的信息,最后 setConfiguration() 使配置生效,代码如下:
1 | /** |
其中子网掩码是通过二进制形式1的位数设置的,比如: 255.255.255.0 则设置为24,LinkAddress 类通过反射方式获取实例。
判断以太网线是否插入
可以通过 /sys/class/net/eth0/operstate 这个文件判断以太网是否插入,插入网线的情况下这个文件的值为 up,未插入情况下为 down,代码如下:
1 | /** 网线是否插入 */ |
获取以太网的连接信息
通过 ConnectivityManager 的 getLinkProperties() 方法获取,代码如下:
1 | /** 获取网线连接信息 */ |
完整源码
1 | package com.xingtel.xtalk.manager; |