Wi-Fi сканирование без вещательного приемника? - PullRequest
4 голосов
/ 10 июня 2011

Я создал сканер Wi-Fi.Он постоянно сканирует доступные сети Wi-Fi.Но мой вопрос: зачем нужен именно широковещательный приемник, если я действительно могу запустить сканирование (вызывать startScan() с таймером каждые x секунд) и получать те же результаты, не создавая широковещательный приемник?onCreate() метод:

i = new IntentFilter();
i.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
receiver = new BroadcastReceiver(){
    public void onReceive(Context c, Intent i){
      WifiManager w = (WifiManager) c.getSystemService(Context.WIFI_SERVICE);
      List<ScanResult> l = w.getScanResults();
      for (ScanResult r : l) {
         // do smth with results
      }
      // log results
    }
};

В методе сканирования, который вызывается после нажатия кнопки сканирования, у меня есть:

timer = new Timer(true);
timer.schedule(new WifiTimerTask(), 0, scanningInterval);
registerReceiver(receiver, i );

где WifiTimerTask равно

publlic class WifiTimerTask extends TimerTask{
    @Override
     public void run(){
         wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
         if (wifi.isWifiEnabled()) {
            wifi.startScan();
            List<ScanResult> sc = wifi.getScanResults(); 
            for (ScanResult r : l) {
               // do smth with results
            }
           // log results
          }
     }
}

И дело в том, что сканирование может выполняться без registerReceiver(receiver,i).Однако, только если scanningInterval меньше 2 с, тогда receiver результаты сканирования и startScan() не синхронизируются.Я имею в виду, что startScan() результаты не изменятся до тех пор, пока receiver не получит новые результаты.Тем временем в logCat я получаю ERROR/wpa_supplicant(5837): Ongoing Scan action....Похоже, 2s самый низкий интервал сканирования.Пожалуйста, поправьте меня, если мои предположения неверны.

1 Ответ

2 голосов
/ 10 июня 2011

Когда вы звоните startScan(), вы не знаете, сколько времени займет фактическое сканирование (вообще говоря, это может быть 1 мс или 5 часов).Таким образом, вы не можете надежно позвонить getScanResults(), поскольку вы не знаете, когда сканирование завершено.

Чтобы отследить событие, когда getScanResults() вернет обновление результатов сканирования, необходимо подписаться на SCAN_RESULTS_AVAILABLE_ACTION.

...