2010-06-05 21 views
5

Próbuję skanować sieci bezprzewodowe i znalazłem to pomocne źródło w sieci. Niestety to nie działa i nie mam pojęcia, dlaczego. Moim problemem jest to, że nie mogę czekać 10 minut na wynik - potrzebuję ich w ciągu kilku sekund i pomyślałem o ustawieniu zmiennej boolowskiej oczekującej na false, gdy tylko dostanę wynik .... cóż, to działa wiecznie .. Wygląda na to, że nic nie zostało odebrane. Dowolny pomysł ? Dzięki.Skanowanie Android dla sieci Wi-Fi

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

Dobrze, proszę spróbować. Czy testowałeś to na prawdziwym urządzeniu lub emulatorze @Nils? – gumuruh

Odpowiedz

3

No ja nie wiem nic na temat przyspieszenia procesu, może to być po prostu, że to zajmuje trochę czasu, aby znaleźć sygnał wifi (to, czy Twój wifi nie jest włączone ... co jest czymś, co twój program powinien sprawdzić przed jego uruchomieniem). Jednak jedną rzecz, którą możesz zrobić, aby poprawić swój przepływ pracy, byłoby zrobienie tego wszystkiego w innej działalności za pomocą funkcji startActivityForResult(). W ten sposób twoja "główna" aktywność będzie mogła działać na tych danych po tym, jak to zrobisz i nie będziesz musiał jeść procesora w pętli.

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

Gdzie umieszczasz ten kod? W onCreate działania?

Problem polega na tym, że rejestrujesz wywołanie zwrotne, które zostanie wywołane, gdy otrzymasz wynik skanowania, który according to the Android API docs jest wykonywany w osobnym wątku, więc twoja pętla zajętości oczekujących nie osiąga niczego w tych okolicznościach, z wyjątkiem niepotrzebnego zatrzymywania twojego aktywność, a jeśli jest to podczas onCreate, oznacza to, że nigdy nie wychodzi z tej metody.

+0

Tak, to była metoda onCreate ... Przeniosłem ją teraz do OnStart, ale nadal nie działa ... wygląda na to, że funkcja onReceive nigdy nie jest wywoływana ... czy może gdzieś jest błąd? I działa dobrze, ale nigdy nie kończy tej pętli ... – Nils

+2

nie chcesz umieścić go w żadnej z metod onCreate, onRestart, onStart, ponieważ wszystkie one stanowią ten sam problem: nigdy nie będziesz wychodził z tych metod, dlatego wywołanie zwrotne nigdy nie będzie zdarzyć. – mtmurdock

3

Ok, znalazłem błąd.

To była pętla. Wygląda na to, że funkcja onReceive nigdy nie jest wywoływana, ponieważ działanie uruchamia tylko tę pętlę. Wygląda na to, że program musi osiągnąć koniec funkcji do wykonania innej funkcji, takiej jak OnReceive ...

Dzięki za pomoc w każdy sposób. Pomogło mi to trochę poprawić :)

10

Musisz wdrożyć słuchanie BroadcastReceiver dla wyników skanowania zwróconych z WifiManager.startScan(). onReceive() umożliwia bezpośredni dostęp do wyników skanowania. trwa około 1 sekundy do skanowania, aby zakończyć i wyzwalać onReceive() ...

+1

To jest właściwa odpowiedź. Jest to sposób na Androida i pozwala niemal natychmiast uzyskać świeże dane. – Eagle

0

Należy napisać w BroadcastReceiver tak:

  1. zarejestrować
  2. Then startScan i zrobić tak

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