Android 获取以太网状态及Ip地址(不通过EthernetManager)

本文介绍了如何在Android应用中使用BroadcastReceiver监听以太网连接状态变化,并获取当前的IP地址。主要展示了EthernetStateReceiver类的实现以及在MainActivity中注册和处理EthernetState事件的方法。
摘要由CSDN通过智能技术生成

话不多说直接上代码,下面是一个以太网的广播接收器:

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)

②:网线插入:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值