2010-06-05 11 views
5

Estoy tratando de buscar redes inalámbricas y encontré esta útil fuente en la red. Lamentablemente no funciona y no tengo idea de por qué. Mi problema es que no puedo esperar 10 minutos para obtener el resultado; los necesito en unos segundos y pensé en configurar la variable booleana esperando en falso tan pronto como obtenga un resultado ... bueno, funciona para siempre ... . Parece que no se recibe nada. Alguna idea ? Gracias.Android Scan for Wifi networks

// -- Sample WiFi implementation - http://groups.google.com/group/android-developers/browse_thread/thread/f722d5f90cfae69 
     IntentFilter i = new IntentFilter(); 
     i.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 
      registerReceiver(new BroadcastReceiver(){ 
       @Override 
       public void onReceive(Context c, Intent i){ 
        // Code to execute when SCAN_RESULTS_AVAILABLE_ACTION event occurs 
        mWifiManager = (WifiManager) c.getSystemService(Context.WIFI_SERVICE); 
        wireless = mWifiManager.getScanResults(); // Returns a <list> of scanResults 
        waiting = false; 
       } 
      } 
     ,i); 
     // -- End Wifi Sample 


     mWifiManager.startScan(); 


     while (waiting) { 
      try { 
       Thread.sleep(200); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      Log.d("PROJECT1","Wifi WAITING"); 
     } 
+0

bien eso es bueno intentarlo. ¿Lo probaste en un dispositivo real o emulador @Nils? – gumuruh

Respuesta

3

Bueno, yo no sé nada acerca de acelerar el proceso, sólo podría ser que se necesita un tiempo para encontrar las señales wifi (eso, o su conexión Wi-Fi no está encendido ... que es algo que su el programa debe verificar antes de que comience). Sin embargo, una cosa que puede hacer para mejorar su flujo de trabajo sería hacer todo esto en una actividad diferente usando startActivityForResult(). De esta forma, su actividad "principal" podrá actuar sobre esos datos una vez que se haya completado y no tendrá que comer la CPU en un ciclo de tiempo.

public void onActivityResult(....){ 
    switch(retCode){ 
    case SCAN_ACTIVITY:{ 
     //do stuff 
     } 
    } 
} 
4

¿Dónde se pone este código? En el onCreate de una actividad?

El problema es que está registrando una devolución de llamada que se llamará cuando reciba los resultados del análisis, que according to the Android API docs se realiza en una secuencia separada, por lo que su bucle de espera ocupada no logra nada en este caso, actividad, y si es durante el onCreate eso significa que nunca sale del método.

+0

Sí, estaba en el método onCreate ... Lo moví ahora a OnStart, pero todavía no funciona ... parece que la función onReceive nunca se llama ... ¿hay algún error en alguna parte? Funciono bien, pero nunca sale de este bucle ... – Nils

+2

No querrá ponerlo en ninguno de los métodos onCreate, onRestart, onStart porque todos plantean el mismo problema: nunca saldrá de esos métodos, por lo tanto, la devolución de llamada nunca ocurrir. – mtmurdock

3

Bien, he encontrado el error.

Era el bucle. Parece que la función onReceive nunca se llama porque la actividad solo ejecuta este ciclo. Parece que el programa tiene que llegar al final de la función para ejecutar otra función como OnReceive ...

Gracias por la ayuda de cualquier manera. Me ayudó a mejorarlo un poco :)

10

necesita implementar un BroadcastReceiver escuchando los resultados de escaneo devueltos desde WifiManager.startScan(). onReceive() le permite acceder a los resuls de escaneo directamente. tardará aproximadamente 1 segundo para el análisis se completa y desencadenar onReceive() ...

+1

Esta es la respuesta correcta. Es la forma de Android, y te permite obtener datos nuevos de manera casi instantánea. – Eagle

0

debe escribir en BroadcastReceiver así:

  1. verlo
  2. Entonces StartScan y hacer como esto

    if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) { 
    
    super.onReceive(context, intent);   
    //Scan is ok, just need few seconds! 
    }