Wi-Fi la scansione senza ricevitore broadcast?
-
26-10-2019 - |
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.
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
.