2012-02-19 39 views
26

Muszę wykryć, kiedy mam połączenie sieciowe z siecią SPECIFIC WIFI.Android WIFI Jak wykryć, kiedy dostępne jest konkretne połączenie WIFI

Na przykład: gdy tylko wejdziesz do domu, a telefon podniesie twoją domową sieć WiFi, chciałbym otrzymać powiadomienie z napisem "Nie ma cię w domu, chciałbyś się z tobą połączyć" ? " Ale chciałbym, żeby to się stało, gdy jestem w moim konkretnym domu.

Czego należy słuchać i jakie testy należy wykonywać, aby upewnić się, że jest to moja konkretna sieć domowa, a nie inna sieć?

+0

w [fragment kodu roboczej] (http://stackoverflow.com/a/15976165/1166727) wyodrębnia wszystko z podłączonych sieci Wi-Fi, przechowywane w urządzeniu i dostępnymi sieciami „niewidocznym” urządzenia. –

Odpowiedz

27

Można użyć BroadcastReceiver aby dowiedzieć się, że sieć wifi nie zmieniło:

BroadcastReceiver broadcastReceiver = new WifiBroadcastReceiver(); 

IntentFilter intentFilter = new IntentFilter(); 
intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 
context.registerReceiver(broadcastReceiver, intentFilter); 

BroadcastReceiver może wyglądać tak. Aby sprawdzić konkretny adres MAC, patrz metoda checkConnectedToDesiredWifi() poniżej.

public class WifiBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION .equals(action)) { 
      SupplicantState state = intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE); 
      if (SupplicantState.isValidState(state) 
        && state == SupplicantState.COMPLETED) { 

       boolean connected = checkConnectedToDesiredWifi(); 
      } 
     } 
    } 

    /** Detect you are connected to a specific network. */ 
    private boolean checkConnectedToDesiredWifi() { 
     boolean connected = false; 

     String desiredMacAddress = "router mac address"; 

     WifiManager wifiManager = 
      (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 

     WifiInfo wifi = wifiManager.getConnectionInfo(); 
     if (wifi != null) { 
      // get current router Mac address 
      String bssid = wifi.getBSSID(); 
      connected = desiredMacAddress.equals(bssid); 
     } 

     return connected; 
    } 
} 
12

Tak długo, jak nie jesteśmy jak kod , tak jak potrzebujesz, do bezpłatnej usługi, mogę tylko polecić, aby przeczytać wszystko, co możliwe na temat Androida i jego możliwości sieci/Wifi, podczas tworzenia takiej aplikacji.

  • Źródła należy zapoznać się i studiować

http://developer.android.com/reference/android/net/wifi/package-summary.html
how to see if wifi is connected in android
How to get my wifi hotspot ssid in my current android system
How to get name of wifi-network out of android using android API?
Get Wifi Interface name on Android

  • Uprawnienia należy poprosić o wh pl tworzenia aplikacji oczywistego

AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 

(ostatni, tylko jeśli chcesz go wykryć swoją lokalizację, aby uniknąć niepotrzebnych połączeń)

  • Należy również zadeklarować , że aplikacja wymaga, aby sieć Wi-Fi była dostępna w urządzeniu, aby działała prawidłowo:

AndroidManifest.xml

<uses-feature android:name="android.hardware.wifi" /> 
+1

Hej, wielkie dzięki. Przeczytam o tym. To było moje pierwsze pytanie na temat stackoverflow. Dzięki za twoją odpowiedź. – ECH5030

+1

@ ECH5030 Proszę bardzo, proszę pana. Nie zapomnij o zaznaczeniu niektórych odpowiedzi, jako zaakceptowanych, co tylko Ty możesz zrobić. Jest to powszechny sposób zamykania wątku pytań na stronach QA :) –

3

użyć standardowego kodu do listy wszystkich dostępnych sieciach:

  • rozpocząć skanowanie

    String connectivity_context = Context.WIFI_SERVICE; 
          final WifiManager wifi = (WifiManager) getSystemService(connectivity_context); 
    if (wifi.isWifiEnabled()) { 
             wifi.startScan(); 
            } 
    
  • zarejestrować odbiornik do danych

    IntentFilter i = new IntentFilter(); 
    i.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 
    
    BroadcastReceiver receiver = new BroadcastReceiver() { 
        @Override 
        public void onReceive(Context context, Intent i) { 
         // TODO Auto-generated method stub 
         ScanWiFiActivity a = ScanWiFiActivity.instance(); 
         WifiManager w = (WifiManager) context 
           .getSystemService(Context.WIFI_SERVICE); 
         List<ScanResult> l = w.getScanResults(); 
         a.Clear(); 
         for (ScanResult r : l) { 
               //use r.SSID or r.BSSID to identify your home network and take action 
          a.setText(r.SSID + "" + r.level + "\r\n"); 
         } 
        } 
    }; 
    registerReceiver(receiver, i); 
    

W FOR bloku pracować magii i podjąć działania podczas identyfikacji sieci SSID i BSSID

+0

To działa świetnie! – Saaram

2

Miałem dokładnie ten sam problem dla mojego projektu, a znalezienie rozwiązania wymagało trochę czasu.

Po pierwsze, "połączenie z Wi-Fi" jest czymś bardzo abstrakcyjnym i okazuje się słuszne. W praktyce, ludzie zwykle myśli wszystkie poniższe kryteria:

  • uwierzytelnionego z punktem dostępowym WiFi
  • związanego z punktem dostępowym
  • dostał adres IP z sieci

Wszystkie te etapy (i kilka innych) są powiązane z różnymi wydarzeniami Andoidu. Więc bez zbędnych ceregieli, tu jest mój (nieco zmodyfikowane) Kod:

public class MyService extends Activity { // or Service 

    //... Other stuff 

    BroadcastReceiver awaitIPAddress = null; 
    private final BroadcastReceiver receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

      if (action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) { 
       if (intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE) == SupplicantState.COMPLETED) { 
        //WiFi is associated 
        WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
        WifiInfo wi = wifiManager.getConnectionInfo(); 
        if (wi != null) { 
         // Wifi info available (should be, we are associated) 
         if (wi.getIpAddress() != 0) { 
          // Lucky us, we already have an ip address. 
          // This happens when a connection is complete, e.g. after rekeying 
          if (wi.getBSSID().equals("c0:ff:ee:c0:ff:ee")) { 
           // ... Do your stuff here 
           // ... 
           // ... 
          } 
         } else { 
          // No ip address yet, we need to wait... 
          // Battery friendly method, using events 
          if (awaitIPAddress == null) { 
           awaitIPAddress = new BroadcastReceiver() { 
            @Override 
            public void onReceive(Context ctx, Intent in) { 
             WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
             WifiInfo wi = wifiManager.getConnectionInfo(); 
             if (wi != null) { 
              if (wi.getIpAddress() != 0) { 
               if (wi.getBSSID().equals("c0:ff:ee:c0:ff:ee")) { 
                // ... Do your stuff here 
                // ... 
                // ... 
               } 
              } 
             } else { 
              ctx.unregisterReceiver(this); 
              awaitIPAddress = null; 
             } 
            } 
           }; 
           // We register a new receiver for connectivity events 
           // (getting a new IP address for example) 
           context.registerReceiver(awaitIPAddress, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 
          } 
         } 
        } 
       } else { 
        // wifi connection not complete, release ip address receiver if registered 
        if (awaitIPAddress != null) { 
         context.unregisterReceiver(awaitIPAddress); 
         awaitIPAddress = null; 
        } 
       } 
      } 
     } 
    }; 

    //... Other stuff 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     //... Other stuff 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 
     registerReceiver(receiver, filter); 
     //... Other stuff 
    } 

    //... Other stuff 

} 

Również nie zaniedbać odpowiednie uprawnienia do manifestu:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

A ja podejrzewam, będzie trzeba także :

<uses-permission android:name="android.permission.INTERNET"/> 
Powiązane problemy