【问题标题】:Android WIFI How To Detect When Specific WIFI Connection is AvailableAndroid WIFI如何检测特定WIFI连接何时可用
【发布时间】:2012-03-10 07:32:13
【问题描述】:

我需要检测何时可以连接到特定的 WIFI 网络。

例如:当您走进您的房子,并且您的手机连接到您的家庭 WiFi 网络时,我想要一个通知,上面写着“您不在您的家庭网络中,您想连接到您家吗? "但我希望这种情况只发生在我特定的房子里。

我应该听什么以及应该做哪些测试来确保它是我的特定家庭网络,而不是另一个网络?

【问题讨论】:

  • 这个snippet of working code从连接的wifi、设备上存储的网络和设备“视线”中的可用网络中提取所有内容。

标签: android wifi


【解决方案1】:

你可以使用BroadcastReceiver来发现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;
    }
}

【讨论】:

    【解决方案2】:

    只要我们不像您需要的代码,免费服务,我只能建议您在创建此类应用程序时阅读有关 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

    • 创建应用程序清单时应要求的权限

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

    【讨论】:

    • 嘿,非常感谢。我会阅读这些。这是我关于stackoverflow的第一个问题。感谢您的回复。
    • @ECH5030 不客气,先生。不要忘记然后将一些答案标记为已接受,这是只有您可以做的。这是在 QA 网站上关闭问题线程的常用方法 :)
    【解决方案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 识别您的网络时,在 FOR 块中发挥您的魔力并采取行动

    【讨论】:

      【解决方案4】:

      我的一个项目遇到了完全相同的问题,花了一段时间才找到解决方案。

      首先,“连接到 WiFi”是非常抽象的东西,事实证明是正确的。在实践中,人们通常指的是以下所有内容:

      • 通过 WiFi 接入点进行身份验证
      • 与接入点关联
      • 从网络获得了一个 IP 地址

      所有这些阶段(以及更多阶段)都与不同的 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"/>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-18
        • 1970-01-01
        • 1970-01-01
        • 2011-11-02
        • 1970-01-01
        • 2013-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多