2012-02-19 59 views
26

我需要檢測何時可以與特定WIFI網絡建立網絡連接。Android WIFI如何在特定WIFI連接可用時進行檢測

例如:當你走進你的房子,並且你的手機拿起你的家庭WiFi網絡時,我想告訴你「你不在你的家庭網絡中,你想連接到你家?」但我希望只有當我在我的家中時纔會發生這種情況。

我應該聽什麼,應該做什麼測試以確保它是我的特定家庭網絡,而不是另一個網絡?

+0

這個[工作代碼片段](http://stackoverflow.com/a/15976165/1166727)提取了從連接的無線網絡連接,在裝置的「視線」上設備和可用網絡存儲網絡。 – 2013-04-12 16:26:10

回答

27

您可以使用廣播接收器來找出WIFI網絡已經改變:

BroadcastReceiver broadcastReceiver = new WifiBroadcastReceiver(); 

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

的BroadcastReceiver可能看起來像這樣。 要檢查特定的MAC地址,請參閱下面的checkConnectedToDesiredWifi()方法。

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

只要我們不需要代碼,免費服務,我只能推薦您,在創建此類應用程序時閱讀關於Android及其網絡/ Wifi可能性的所有可能信息。

  • 來源你應該閱讀並研究

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

  • 權限,你應該問WH CS創建應用程序清單

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

最後一個,只要你想它來檢測你的位置,以避免不必要的電話

  • 你也應該申報,你的應用程序需要wifi才能在設備上正常工作:

AndroidManifest.xml

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

嘿,非常感謝。我會閱讀這些。這是我在stackoverflow上的第一個問題。感謝您的答覆。 – ECH5030 2012-02-20 02:00:45

+1

@ ECH5030不客氣,先生。不要忘了,然後標記一些答案,如接受,這是你只能做的。這是關閉QA網站上的問題線程的常見方式:) – 2012-02-20 14:09:17

3

使用標準的代碼,列出所有可用的網絡:

  • 開始掃描

    String connectivity_context = Context.WIFI_SERVICE; 
          final WifiManager wifi = (WifiManager) getSystemService(connectivity_context); 
    if (wifi.isWifiEnabled()) { 
             wifi.startScan(); 
            } 
    
  • 註冊用於接收器的數據

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

在塊工作,你的魔力,當你通過SSID或BSSID識別網絡採取行動

+0

這是一個偉大的人! – Saaram 2013-01-14 19:55:42

2

我對於我的項目有完全相同的問題,並且需要一段時間才能找到解決方案。

首先,「連接到WiFi」是非常抽象的東西,事實證明是正確的。在實踐中,人們通常是指所有的以下內容:

  • 與接入點
  • 得到了來自網絡中的IP地址相關聯的WiFi接入點
  • 認證

所有這些階段(以及更多)與不同的Andoid事件相關聯。因此,事不宜遲,這裏是我的(略有修改)代碼:

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 

} 

另外,不要忽略了適當的權限清單:

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

我強烈懷疑你還需要:

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