Pregunta

He creado el escáner Wi-Fi. Se escanea continuamente para las redes Wi-Fi disponibles. Pero mi pregunta es por qué es necesario transmitir exactamente el receptor si realmente puedo ejecutar escaneo (invocar startScan() ¿Con el temporizador cada x segundos) y recibir los mismos resultados sin crear receptor de transmisión?

Este es el código del receptor de transmisión en onCreate() método:

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

En el método de escaneo, que se invoca después de que se presione el botón de escaneo, tengo:

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

dónde WifiTimerTask es

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

Y el punto es que el escaneo se puede realizar sin registerReceiver(receiver,i). Sin embargo, solo si scanningInterval es inferior a 2s, entonces receiver scanResults y startScan() no están sincronizados. Por eso quiero decir startScan() Los resultados no cambian hasta receiver obtendrá nuevos resultados. Mientras tanto en Logcat obtengo ERROR/wpa_supplicant(5837): Ongoing Scan action.... Sin embargo, parece que 2S es el intervalo de escaneo más bajo. Por favor, corrígeme si mis suposiciones están mal.

¿Fue útil?

Solución

Cuando usted llama startScan() No sabe cuánto tiempo llevará el escaneo real (en general, puede ser 1 ms o 5 horas). Entonces no puedes llamar de manera confiable getScanResults() Como no sabe cuándo se completa el escaneo.

Para rastrear el evento cuando getScanResults() devolverá los resultados de la exploración de actualizaciones a los que debe suscribirse SCAN_RESULTS_AVAILABLE_ACTION.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top