Подождите, пока startScan завершит сканирование

#android #wifimanager #indoor-positioning-system

#Android #wifimanager #система позиционирования в помещении

Вопрос:

У меня вопрос об использовании WiFiManger в моем приложении. Код довольно прост, я создал эту службу, которая сканирует сеть, чтобы получить доступный Wi-Fi:

 @Override
public int onStartCommand(Intent intent, int flags, int startId) {
    mapName = intent.getExtras().getString("mapName");
    sendNotification();
    mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);

    // Check for wifi is disabled
    if (!mainWifi.isWifiEnabled()) {
        // If wifi disabled then enable it
        Toast.makeText(getApplicationContext(), "wifi is disabled..making it enabled",
                Toast.LENGTH_LONG).show();

        mainWifi.setWifiEnabled(true);
    }
    mainWifi.startScan();
    List<ScanResult> scanResults=mainWifi.getScanResults();
    readAps=getAps(scanResults);
    //List of AP received in current position
    String result=compareRP();
    if(!result.isEmpty())
        Toast.makeText(this, "Localized in RP: " result, Toast.LENGTH_LONG).show();
    else
        Toast.makeText(this, "Unable to localize you in this map", Toast.LENGTH_LONG).show();
    return START_NOT_STICKY;
}

private ArrayList<AccessPoint> getAps(List<ScanResult> scanResults) {
    ArrayList<AccessPoint> temp = new ArrayList<AccessPoint>();
    for(ScanResult s:scanResults){
        temp.add(new AccessPoint(s.SSID,s.level,s.frequency));
    }
    return temp;
}
  

Как я могу добавить это условие: я хочу дождаться «свежего» списка Wi-Fi, который появляется, когда:

     mainwifi.startScan();
  

метод возвращает.

Теперь моя служба по-прежнему работает с алгоритмом сопоставления кластеров, и я этого не хочу. Что я должен делать?

Спасибо за любую помощь!

Фред

Комментарии:

1. Зарегистрируйтесь на трансляцию, и у вас будет список wifi. Вы не можете ждать.

2. Я пытался разрешить это с помощью BroadcastReceiver, но это не работает … для сопоставления кластеров мне нужен полный список для сравнения, поэтому я должен подождать, пока метод mainWifi.startScan() вернет мне «true». (Вот пример кода с BroadcastReceiver: pastebin.com/RxV2XFEi )

3. Вы должны реализовать широковещательную передачу, которая будет прослушивать SCAN_RESULTS_AVAILABLE_ACTION. Android запускает его, когда сканирование будет готово. startScan используется для запуска сканирования и возвращает true / false, чтобы сообщить вам, начал ли он поиск или нет. Вы не можете ждать завершения сканирования. Вы должны переместить логику своего приложения в onReceive трансляции.

Ответ №1:

Вы должны использовать a BroadcastReceiver внутри своей активности.

 private final BroadcastReceiver mWifiScanReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context c, Intent intent) {
        // This condition is not necessary if you listen to only one action
        if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
            List<ScanResult> mScanResults = mWifiManager.getScanResults();
            Toast.makeText(getApplicationContext(), "Scan results are available", Toast.LENGTH_LONG).show();
            // Do what you want
        }
    }
};

private WifiManager mWifiManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);

    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
    // You can add multiple actions... 
    registerReceiver(mWifiScanReceiver, intentFilter);
    // ...
    mWifiManager.startScan();

}