自学内容网 自学内容网

Android wifi列表中去自身的热点

Android wifi列表中去自身的热点

一、前言

Android wifi列表中能搜索到自身的热点wifi?
正常手机上都不会出现这个问题;可能是系统底层已经做了过滤处理。

现实开发中Android设备的Wifi能搜索到自身热点也可能会存在。
比如基于两个单独的wifi双模组硬件在设备上运行就有可能出现这个问题;
之前同一个硬件上的双模组wifi硬件都是没有这个问题的。

双模组wifi是为了更好支持wifi和热点隔离的硬件,

Android 双模组的情况可能会存在wifi列表中搜索到自己的热点名称是可以正常连接,
但是设备重启后wifi会处于一直连接和断开的状态。

不确定底层是否可以优化处理这个热点wifi显示的问题;
但是应用上也是可以过滤显示的;
应用扫描到后,不显示到自身的热点wifi,这样也可以避免连接和后续的问题。

Android wifi列表中去自身的热点wifi的关键是判断热点的mac地址和wifi的BSSID是否一致。

这里记录一下,平时不一定用得到!

二、从扫描的Wifi列表中去除自身热点Wifi的实现

1、获取节点的mac地址代码实现

输入节点名称即可获取mac地址。


    //获取XXX 节点MAC地址
    public static String getHardwareAddress(String name) {
        Enumeration<NetworkInterface> interfaces = null;
        try {
            interfaces = NetworkInterface.getNetworkInterfaces();
        } catch (SocketException e) {
            e.printStackTrace();
        }
        String hardWareAddress = null;
        NetworkInterface iF = null;
        if (interfaces == null) {
            return null;
        }
        while (interfaces.hasMoreElements()) {
            iF = interfaces.nextElement();
            try {
                if (iF.getName().equals(name)) {
                    hardWareAddress = bytesToString(iF.getHardwareAddress());
                    break;
                }
            } catch (SocketException e) {
                e.printStackTrace();
            }
        }
        return hardWareAddress;
    }

    private static String bytesToString(byte[] bytes) {
        if (bytes == null || bytes.length == 0) {
            return null;
        }
        StringBuilder buf = new StringBuilder();
        for (byte b : bytes) {
            buf.append(String.format("%02X:", b));
        }
        if (buf.length() > 0) {
            buf.deleteCharAt(buf.length() - 1);
        }
        return buf.toString();
    }

上面的就是获取节点信息的代码。节点其他信息有需求的也可以获取。

2、wifi列表中过滤热点wifi的代码

  final List<AccessPoint> accessPoints = mWifiTracker.getAccessPoints();

        if(mWifiManager.getWifiApState() == WifiManager.WIFI_AP_STATE_ENABLED){
            //如果热点开了并且WiFi扫描到了本机自己的热点的话去掉
            String localHotspotMac = EthernetUtil.getHardwareAddress("ap0");
            LogUtil.debug("ap0 mac = " + localHotspotMac);
            if(localHotspotMac == null || localHotspotMac.isEmpty()){
                localHotspotMac = EthernetUtil.getHardwareAddress("wlan1");
                LogUtil.debug("wlan mac = " + localHotspotMac);
            }
            int localHotspotIndex = -1;
            for (int i = 0; i < accessPoints.size(); i++) {
                AccessPoint accessPoint = accessPoints.get(i);
                if(accessPoint.getBssid() != null && accessPoint.getBssid().equalsIgnoreCase(localHotspotMac)){
                    localHotspotIndex = i;
                    LogUtil.debug("accessPoint.getSsidStr()--" + accessPoint.getSsidStr() +" accessPoint.getBssid()--"+accessPoint.getBssid() + localHotspotMac);
                    break;
                }
            }
            if(localHotspotIndex >= 0){
                accessPoints.remove(localHotspotIndex);
                LogUtil.debug("accessPoints size after remove:" + accessPoints.size());
            }
        }

Android设备热点正常节点都是ap0,但是也会有设备有的wlan1;
也有的两个节点都用的情况,比如热点+投屏;
所以启动哪个节点是热点写死在上面就行,不需要判断两个节点的逻辑。

上面举例的是SettingsLib获取wifi列表的方式获取的wifi信息对象 AccessPoint。

如果是wifi扫描的普通对象ScanResult 也是有BSSID这个信息的。


原文地址:https://blog.csdn.net/wenzhi20102321/article/details/145213799

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!