Java 唯一筛选wifi网络名称

Java 唯一筛选wifi网络名称,java,android,android-arrayadapter,android-wifi,wifimanager,Java,Android,Android Arrayadapter,Android Wifi,Wifimanager,我想在微调器中显示可用wifi网络的列表。但在当前版本中,当范围内有许多wifi网络时,我会得到许多重复网络和空白值。如何唯一标识每个wifi网络名称?我试过各种方法,但仍然不能正确地得到它。我们将非常感谢在这方面提供的任何帮助。我目前为android 24以后版本编写的代码是: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { List<ScanResult> wifiList = wifi

我想在微调器中显示可用wifi网络的列表。但在当前版本中,当范围内有许多wifi网络时,我会得到许多重复网络和空白值。如何唯一标识每个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();
        }
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.N){
List wifiList=wifiManager.getScanResults();
ssids=wifiList.stream()
.map(scanResult->scanResult.SSID)
.filter(ssid->ssid.equals(“”)
.distinct()
.collect(Collectors.toList());
deviceList=新字符串[ssids.size()];
对于(int i=0;i
如果您看到的是相同的SSID,很可能是因为BSSID不同

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

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

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

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

上面代码的问题是,
filter()
没有按预期的方式工作。您似乎希望它过滤掉
ssid.equals(“”
),而实际上
filter()
将删除任何与标准不匹配的项。 你可以在地图上看到一个例子

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

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