Domanda

Ho creato scanner wi-fi. Esegue la scansione di continuo per le reti Wi-Fi disponibili. Ma la mia domanda è: è necessario un ricevitore perché sarebbe esattamente trasmissione, se posso effettivamente eseguito la scansione (invoke startScan() con temporizzatore ogni x secondi) e ricevere gli stessi risultati senza creare ricevitore broadcast?

Questo è il codice ricevitore trasmissione nel metodo 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
    }
};

Nel metodo di scansione, che viene richiamato dopo aver premuto il pulsante di scansione che ho:

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

dove 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
          }
     }
}

E il punto è che la scansione può essere eseguita senza registerReceiver(receiver,i). Tuttavia solo se scanningInterval è inferiore a 2s, quindi scanresults receiver e startScan() non sono sincronizzati. Con questo voglio i risultati medi startScan() non cambio fino receiver otterranno nuovi risultati. Nel frattempo in logcat ottengo ERROR/wpa_supplicant(5837): Ongoing Scan action.... Sembra 2s è il più basso intervallo di scansione però. Si prega di correggere se le mie supposizioni sono sbagliate.

È stato utile?

Soluzione

Quando si chiama startScan() non si sa per quanto tempo la scansione effettiva avrà (in generale può essere di 1 ms o 5 ore). Così non si può chiamare in modo affidabile getScanResults() come non si sa quando la scansione è completata.

Per monitorare l'evento quando quando getScanResults() restituirà i risultati con scansione è necessario abbonarsi a SCAN_RESULTS_AVAILABLE_ACTION.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top