Уникальная фильтрация названий сетей Wi-Fi - PullRequest
1 голос
/ 20 марта 2020

Я хочу отобразить список доступных сетей Wi-Fi в счетчике. Но с текущей версией, я получаю много дублирующих сетей и значений пробелов, когда есть много сетей Wi-Fi в диапазоне. Как я могу уникально идентифицировать каждое имя сети Wi-Fi? Я пробовал различные методы и до сих пор не смог получить его правильно. Любая помощь в этом отношении будет принята с благодарностью. мой текущий код, который сделан для 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();
        }

1 Ответ

0 голосов
/ 20 марта 2020

Если вы видите тот же SSID, скорее всего, потому что BSSID отличается.

Возможно, вы видите разные маршрутизаторы, которые принадлежат разным сетям, но имеют одно и то же имя (например, «netgear» или «dlink»). Это распространено в плотных жилых районах.

Вы также можете видеть различные маршрутизаторы, которые принадлежат к той же сети . Это будут разные точки доступа в корпоративной сети, например, стратегически расположенные для обеспечения максимального покрытия.

Возможно, вы также видите законно дублированные записи.

У вас есть несколько вариантов решения этих проблем, но общепринятый подход заключается в дедупликации по BSSID, а затем отображении списка SSID с измерителями сигнала.

Проблема с вашим кодом выше в том, что filter() работает не так, как вы ожидаете. Кажется, вы ожидаете, что он отфильтрует из ssid.equals(""), тогда как на самом деле filter() удалит все элементы, которые не соответствуют критериям. Вы можете увидеть пример этого на странице документации Stream .

Вы хотите изменить .filter(ssid -> ssid.equals("")) на

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