web-dev-qa-db-fra.com

Android WIFI Comment détecter quand une connexion WIFI spécifique est disponible

Je dois détecter quand j'ai une connectivité réseau à un réseau WIFI SPÉCIFIQUE.

Par exemple: dès que vous entrez dans votre maison et que votre téléphone détecte votre réseau Wi-Fi domestique, je voudrais une notification qui dit "Vous n'êtes pas sur votre réseau domestique, souhaitez-vous vous connecter à votre domicile?" Mais j'aimerais que cela ne se produise que lorsque je suis chez moi.

Que dois-je écouter et quels tests dois-je faire pour m'assurer qu'il s'agit bien de mon réseau domestique spécifique, et non d'un autre réseau?

27
ECH5030

Vous pouvez utiliser BroadcastReceiver pour découvrir que le réseau wifi a changé:

BroadcastReceiver broadcastReceiver = new WifiBroadcastReceiver();

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

Le BroadcastReceiver peut ressembler à ceci. Et pour vérifier l'adresse MAC spécifique, voir la méthode checkConnectedToDesiredWifi () ci-dessous.

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;
    }
}
28
petrsyn

Tant que nous n'avons rien à voir avec le code dont vous avez besoin, pour un service gratuit , je ne peux que vous recommander, de lire tout ce qui est possible sur Android et ses possibilités de réseau/Wifi, lors de la création d'une telle application.

  • Sources à lire et à étudier

http://developer.Android.com/reference/Android/net/wifi/package-summary.html
comment voir si le wifi est connecté dans Android
Comment obtenir mon SSID de hotspot wifi dans mon actuel Android
Comment obtenir le nom du réseau wifi hors de Android en utilisant Android API?
Obtenir le nom de l'interface Wifi sur Android

  • Autorisations à demander lors de la création d'un manifeste d'application

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

( le dernier, seulement si vous voulez qu'il détecte votre position, pour éviter les appels inutiles)

  • Vous devez également déclarer que votre application a besoin du wifi pour être disponible dans l'appareil, pour fonctionner correctement:

AndroidManifest.xml

<uses-feature Android:name="Android.hardware.wifi" />
12
Marek Sebera

Utilisez le code standard pour répertorier tous les réseaux disponibles:

  • lancer l'analyse

    String connectivity_context = Context.WIFI_SERVICE;
                final WifiManager wifi = (WifiManager) getSystemService(connectivity_context);  
    if (wifi.isWifiEnabled()) {
                            wifi.startScan();
                        }
    
  • enregistrer un récepteur pour les données

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

Dans le bloc FOR, travaillez votre magie et agissez lorsque vous identifiez votre réseau par SSID ou BSSID

4
Andrei G

J'ai eu exactement le même problème pour un de mes projets et j'ai mis du temps à trouver une solution.

Tout d'abord, "se connecter à un WiFi" est quelque chose de très abstrait, et cela se révèle à juste titre. Dans la pratique, les gens signifient généralement tout ce qui suit:

  • authentifié avec un point d'accès WiFi
  • associé au point d'accès
  • a obtenu une adresse IP du réseau

Toutes ces étapes (et plusieurs autres) sont associées à différents événements andoïdes. Alors, sans plus tarder, voici mon code (légèrement modifié):

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

}

Ne négligez pas non plus les autorisations appropriées sur le manifeste:

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

Et je soupçonne fortement que vous aurez également besoin de:

<uses-permission Android:name="Android.permission.INTERNET"/>
3
tazmanos