29

I need to detect when I have network connectivity to a SPECIFIC WIFI network.

For example: As soon as you walk into your house, and your phone picks up your home WiFi network, I would like a notification that says "You are not at your home network, would you like to connect to you Home?" But I would like that to only happen when I am at my specific house.

What should I listen for and what tests should I do to make sure it is my specific home network, and not another network?

ECH5030
  • 404
  • 1
  • 4
  • 10
  • this [snippet of working code](http://stackoverflow.com/a/15976165/1166727) extracts everything from connected wifi, stored networks on device and available networks in "sight" of device. – tony gil Apr 12 '13 at 16:26

4 Answers4

30

You can use BroadcastReceiver to find out that wifi network has changed:

BroadcastReceiver broadcastReceiver = new WifiBroadcastReceiver();

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

The BroadcastReceiver may look like this. And to check for specific MAC address see the checkConnectedToDesiredWifi() method bellow.

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;
    }
}
petrsyn
  • 4,678
  • 3
  • 38
  • 47
12

As long, as we are nothing like code as you need, for free service, I can only recommend you, to read everything possible about Android and its Network/Wifi possibilities, when creating such app.

  • Sources you should read up and study

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

  • Permissions you should ask for when creating application manifest

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

(the last one, only if you want it to detect your location, to prevent unnecessary calls)

  • You should also declare, that your application needs wifi to be available in device, to work properly:

AndroidManifest.xml

<uses-feature android:name="android.hardware.wifi" />
Community
  • 1
  • 1
Marek Sebera
  • 37,155
  • 34
  • 153
  • 231
  • 1
    Hey, thanks a lot. I will read up on these. This was my first question on stackoverflow. Thanks for your response. – ECH5030 Feb 20 '12 at 02:00
  • 1
    @ECH5030 You're welcome sir. Don't forget then mark some of the answers, as accepted, which is what only you can do. It's common way of closing question thread on QA sites :) – Marek Sebera Feb 20 '12 at 14:09
4

I had exactly the same problem for a project of mine and it took a while to find a solution.

First of all, "connecting to a WiFi" is something very abstract, and it turns out rightly so. In practice, people usually mean all of the following:

  • authenticated with a WiFi access point
  • associated with the access point
  • got an ip address from the network

All these stages (and several more) are associated with different Andoid events. So, without further ado, here is my (slightly modified) code:

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

}

Also, don't neglect the appropriate permissions to the manifest:

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

And I strongly suspect you will also need:

<uses-permission android:name="android.permission.INTERNET"/>
tazmanos
  • 303
  • 2
  • 9
4

Use the standard code to list all available networks:

  • start the scan

    String connectivity_context = Context.WIFI_SERVICE;
                final WifiManager wifi = (WifiManager) getSystemService(connectivity_context);  
    if (wifi.isWifiEnabled()) {
                            wifi.startScan();
                        }
    
  • register a receiver for the data

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

In the FOR block work your magic and take action when you identify your network by SSID or BSSID

Andrei G
  • 1,552
  • 8
  • 13