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)!