话不多说直接上代码,下面是一个以太网的广播接收器:
public class EthernetStateReceiver extends BroadcastReceiver {
private EthernetStateListener ethernetStateListener;
private String ipType = "eth0";
private String TAG = "ethernet tag";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//监听往落状态变化
if (action != null && action.equals(ConnectivityManager.CONNECTIVITY_ACTION)){
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
//判断是否连接到以太网
if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_ETHERNET){
//以太网连接
Log.e(TAG,"以太网已连接");
String ipAddress = getIpAddress();
ethernetStateListener.ethernetState(EthernetState.ETHERNET_CONNECTED , ipAddress);
}else {
//以太网断开
Log.e(TAG,"以太网已断开");
ethernetStateListener.ethernetState(EthernetState.ETHERNET_DISCONNECTED , null);
}
}
}
public String getIpAddress() {
String hostIp = null;
try {
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = networkInterfaces.nextElement();
if (!networkInterface.getName().equals(ipType)) {
continue;
}
Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
while (inetAddresses.hasMoreElements()) {
InetAddress inetAddress = inetAddresses.nextElement();
// 过滤掉IPv6地址和127段的ip
if (!(inetAddress instanceof Inet6Address) && !inetAddress.getHostAddress().startsWith("127.")) {
hostIp = inetAddress.getHostAddress();
break;
}
}
if (hostIp != null) {
break; // 如果找到了合适的IP地址,则结束外层循环
}
}
} catch (SocketException e) {
e.printStackTrace();
}
Log.e(TAG, "ipAddress:" + hostIp);
return hostIp;
}
//以太网状态监听接口
public interface EthernetStateListener{
void ethernetState(EthernetState ethernetState , String ipAddress);
}
//监听注入
public void setEthernetStateListener(EthernetStateListener ethernetStateListener){
this.ethernetStateListener = ethernetStateListener;
}
}
然后在MainActivity中:
public class MainActivity extends AppCompatActivity implements EthernetStateReceiver.EthernetStateListener{
private EthernetStateReceiver ethernetStateReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//注册ethernet广播接收器
ethernetStateReceiver = new EthernetStateReceiver();
IntentFilter intentEthernetFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(ethernetStateReceiver,intentEthernetFilter);
//注入ethernet监听
ethernetStateReceiver.setEthernetStateListener(this);
}
@Override
public void ethernetState(EthernetState ethernetState , String ipAddress) {
switch (ethernetState){
case ETHERNET_CONNECTED:
//以太网已连接
String ethIpAddress = ipAddress;
break;
case ETHERNET_DISCONNECTED:
//以太网已断开
break;
}
}
}
其中EthernetState是一个自定义的枚举类,自己定义ETHERNET_CONNECTED就好,下面是测试的部分截图,可以实时监听网线的插拔:
①:网线拔出(我这里连了WiFi,所以还有WiFi的IP)
②:网线插入: