唯一过滤 wifi 网络名称

Filter wifi network names uniquely

我想在微调器中显示可用的 wifi 网络列表。但是对于当前版本,当该范围内有许多 wifi 网络时,我会得到很多重复的网络和白色 space 值。如何唯一标识每个 wifi 网络名称?我尝试了各种方法,仍然无法正确获取。在这方面的任何帮助将不胜感激。我当前为 android 24 之后制作的代码是:

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            List<ScanResult> wifiList = wifiManager.getScanResults();
            ssids = wifiList.stream()
                    .map(scanResult -> scanResult.SSID)
                    .filter(ssid -> ssid.equals(""))
                    .distinct()
                    .collect(Collectors.toList());

            deviceList = new String[ssids.size()];
            for (int i = 0; i < ssids.size(); i++) {
                deviceList[i] = ((ssids.get(i)));

                if(SCAN_RESULTS_AVAILABLE_ACTION.equals(true)){
                    wifiManager.disconnect();
                }
            }


             ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, 
             android.R.layout.simple_spinner_item, deviceList) {
                @Override
                public View getView(int position, View convertView, ViewGroup parent) {

                    View v = super.getView(position, convertView, parent);
                    if (position == getCount()) {
                        ((TextView)v.findViewById(android.R.id.text1)).setText("");
                        ((TextView)v.findViewById(android.R.id.text1)).setHint(getItem(getCount())); 
                        //"Hint to be displayed"
                    }

                    return v;
                }

                @Override
                public int getCount() {
                    return super.getCount()-1; // you don't display last item. It is used as hint.
                }
            };
            adapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
            wifiDeviceList.setAdapter(adapter);
            wifiDeviceList.setSelection(adapter.getCount());//set the hint the default selection so it appears on launch.
            wifiDeviceList.setOnItemSelectedListener(this);
            adapter.notifyDataSetChanged();
        }

如果您看到相同的 SSID,可能是因为 BSSID 不同。

您可能会看到属于不同网络但恰好具有相同名称的不同路由器(例如 "netgear" 或 "dlink")。这在密集的住宅区很常见。

您可能还会看到属于同一 网络的不同路由器。这些将是公司网络上的不同接入点,例如,战略性地放置以提供最大覆盖范围。

您可能还会看到合法的重复条目。

对于如何处理这些问题,您有多种选择,但普遍接受的方法是通过 BSSID 进行重复数据删除,然后显示带有信号表的 SSID 列表。

上面代码的问题是 filter() 没有按照您期望的方式工作。您似乎希望它过滤 out ssid.equals(""),而实际上 filter() 会删除任何 not[=36] 的项目=] 符合条件。 您可以在 Stream documentation page 上看到这方面的示例。

您想将 .filter(ssid -> ssid.equals("")) 更改为

.filter(ssid -> !ssid.equals(""))