Определите сети Wi-Fi уникально во время сканирования - PullRequest
1 голос
/ 04 марта 2020

Я хочу добавить функцию сканирования Wi-Fi в мое приложение, которое будет сканировать все сети Wi-Fi в пределах диапазона и перечислять SSID в Spinner. Мне удалось реализовать это с помощью следующего кода. Но при сканировании показывается несколько сетевых имен с одинаковым именем (при сканировании с настройками wifi телефона нет одинаковых сетей) и много пустых строк в Spinner. Я ценю любые предложения о том, как я могу предотвратить эту проблему, однозначно идентифицируя имена сетей без дублирования или пустых строк.

Пожалуйста, найдите мой класс приемника Wi-Fi здесь.

class WifiReceiver extends BroadcastReceiver {
    WifiManager wifiManager;
    Spinner wifiDeviceList;
    String[] deviceList;
public WifiReceiver(WifiManager wifiManager, Spinner wifiDeviceList) {
    this.wifiManager = wifiManager;
    this.wifiDeviceList = wifiDeviceList;
}


public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) {
        List<ScanResult> wifiList = wifiManager.getScanResults();
        deviceList = new String[wifiList.size()];

        for (int i = 0; i < wifiList.size(); i++) {
            deviceList[i] = ((wifiList.get(i).SSID));
        }


ArrayAdapter arrayAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, deviceList);

        arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
        wifiDeviceList.setAdapter(arrayAdapter);

    }
}
}

1 Ответ

1 голос
/ 04 марта 2020

Начиная с уровня API 24 (Android 7.0) и далее сначала сортируются по самым сильным сетям:

List<ScanResult> wifiList = wifiManager.getScanResults();
List<String> ssids = wifiList.stream()
    .sorted((sr1, sr2) -> sr1.compareTo(sr2)) 
    .map(scanResult -> scanResult.SSID)
    .filter(ssid -> ssid.equals(""))
    .distinct()
    .collect(Collectors.toList());
...