Android开发如何遍历List<ScanResult>获取各WiFi扫描结果信息
访问List集合中ScanResult实例信息的实现方法
你在拿到List<ScanResult> scanResults集合后,只需要遍历集合取出每一个独立的ScanResult实例对象,再通过实例访问对应字段、调用对应方法即可拿到热点信息,注意SSID、BSSID属于实例成员属性,不是类静态属性,不能直接通过类名调用。
常用遍历实现
- 带索引的基础for循环(逻辑最直观,适合新手)
// 必须先判空,扫描失败、权限不足时结果可能为null,直接调用会触发空指针崩溃 if (scanResults != null && !scanResults.isEmpty()) { for (int index = 0; index < scanResults.size(); index++) { // 取出当前索引位置的单个热点实例 ScanResult currentAp = scanResults.get(index); // 访问实例公开字段获取热点信息 String apSsid = currentAp.SSID; // 热点名称 String apBssid = currentAp.BSSID; // 热点MAC地址 int apRssi = currentAp.level; // 热点信号强度,单位dBm int apFreq = currentAp.frequency; // 热点工作频段,单位MHz // 调用实例方法获取扩展信息,比如信息元素 // List<ScanResult.InformationElement> infoElements = currentAp.getInformationElements(); // 此处写入自定义业务逻辑,比如打印日志、过滤特定热点 Log.i("WifiScanResult", "序号:" + index + ",SSID:" + apSsid + ",BSSID:" + apBssid + ",信号:" + apRssi + "dBm"); } }
- 增强for循环(写法更简洁,不需要索引时推荐使用)
if (scanResults != null) { for (ScanResult currentAp : scanResults) { // 取值逻辑和基础for循环完全一致 String ssid = currentAp.SSID; String bssid = currentAp.BSSID; // 自定义业务处理 } }
配合RangingRequest使用的示例
如果你需要把扫描到的热点添加到RTT测距请求中,遍历时直接将符合条件的ScanResult实例传入Builder的添加方法即可:
RangingRequest.Builder rangingBuilder = new RangingRequest.Builder(); if (scanResults != null) { for (ScanResult ap : scanResults) { // 先校验热点是否支持802.11mc RTT测距能力,避免添加不支持的设备导致报错 if (ap.is80211mcResponder()) { rangingBuilder.addAccessPoint(ap); } } } RangingRequest rangingRequest = rangingBuilder.build();
新手注意事项
- 所有遍历操作前必须做判空校验,Wifi扫描流程受权限、系统状态影响很大,返回null是常见情况
- Android 8.0及以上版本对ScanResult返回的字段做了权限限制,Android 12+需要声明
ACCESS_FINE_LOCATION、NEARBY_WIFI_DEVICES权限并动态申请通过,否则会拿到<unknown ssid>这类无效值- 部分系统定制ROM会对Wifi扫描结果做隐藏处理,未授信的应用可能拿到空列表,调试时需要注意排查权限和系统限制问题
内容的提问来源于stack exchange,提问作者Allen997
相关产品推荐
相关产品推荐

