2010-06-05 4 views
5

J'essaie de numériser pour les réseaux sans fil et trouvé cette source utile sur le net. Malheureusement, cela ne fonctionne pas et je ne sais pas pourquoi. Mon problème est que je ne peux pas attendre 10 minutes pour le résultat - j'en ai besoin dans quelques secondes et j'ai pensé à paramétrer la variable booléenne en attente sur false dès que j'obtiens un résultat ... eh bien, ça marche pour toujours. On dirait que rien n'est reçu. Une idée ? Merci.Android Scan pour les réseaux Wifi

// -- 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 c'est bien essayer. L'avez-vous testé sur un périphérique réel ou un émulateur @Nils? – gumuruh

Répondre

3

Eh bien je ne sais pas quoi que ce soit au sujet d'accélérer le processus, il pourrait simplement être qu'il faut un certain temps pour trouver les signaux wifi (qui, ou votre connexion Wi-Fi est pas allumé ... ce qui est quelque chose que votre programme devrait vérifier avant qu'il ne commence). Cependant, une chose que vous pouvez faire pour améliorer votre flux de travail serait de faire tout cela dans une activité différente en utilisant startActivityForResult(). De cette façon, votre activité "principale" sera capable d'agir sur ces données après que c'est fait et vous n'aurez pas à manger le CPU sur une boucle.

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

Où mettez-vous ce code? Dans onCreate d'une activité? Le problème est que vous enregistrez un rappel qui sera appelé lorsque vous recevez les résultats de l'analyse. Le according to the Android API docs est effectué dans un thread séparé, de sorte que votre boucle d'attente n'atteint rien à cette situation, sauf en interrompant inutilement votre activité, et si c'est pendant le onCreate cela signifie qu'il ne quitte jamais la méthode.

+0

Oui, il était dans la méthode onCreate ... Je l'ai déplacé maintenant à OnStart, mais il ne fonctionne toujours pas ... il semble que la fonction onReceive n'est jamais appelée ... Y at-il peut-être quelque part une erreur? Je fonctionne bien, mais il ne quitte jamais cette boucle ... – Nils

+2

vous ne voudrez pas le mettre dans l'une des méthodes onCreate, onRestart, onStart car ils posent tous le même problème: vous ne quitterez jamais ces méthodes, donc le rappel ne sera jamais se produire. – mtmurdock

3

Ok, j'ai trouvé l'erreur.

C'était la boucle. Il semble que la fonction onReceive n'est jamais appelée car l'activité exécute cette boucle uniquement. On dirait que le programme doit atteindre la fin de la fonction pour exécuter d'autres fonctions comme OnReceive ...

Merci pour l'aide de toute façon. Il m'a aidé à l'améliorer un peu :)

10

vous devez implémenter un BroadcastReceiver en écoutant les résultats d'analyse retournés de WifiManager.startScan(). onReceive() vous permet d'accéder directement aux résultats de scan. il faut environ 1 seconde pour l'analyse pour compléter et déclencher onReceive() ...

+1

C'est la bonne réponse. C'est la manière Android, et vous permet d'obtenir presque instantanément des données fraîches. – Eagle

0

Vous devriez écrire dans BroadcastReceiver comme ceci:

  1. Enregistrez-le
  2. Puis startScan et faire comme ce

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