web-dev-qa-db-fra.com

Obtenir le SSID lorsque le WIFI est connecté

J'essaie d'obtenir le SSID du réseau WIFI lorsque mon appareil Android est connecté à WIFI.

J'ai enregistré un BroadcastReceiver à l'écoute de Android.net.wifi.supplicant.CONNECTION_CHANGE. Je reçois la notification lorsque WIFI est déconnecté ou reconnecté. Malheureusement, je ne peux pas obtenir le SSID du réseau.

J'utilise le code suivant pour trouver le SSID:

WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String ssid = wifiInfo.getSSID();

Au lieu du SSID, je récupère la chaîne <unknown ssid> .

Ce sont les autorisations dans le manifeste (j'ai ajouté ACCESS_NETWORK_STATE juste pour vérifier, je n'en ai pas réellement besoin)

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

Pourquoi cela arrive-t-il? Comment puis-je obtenir le SSID réel? La diffusion est-elle renvoyée trop tôt, avant que la connexion ne soit établie? Y a-t-il une autre émission à écouter? Je ne m'intéresse qu'aux connexions WIFI, pas aux connexions 3G.

Mise à jour: je viens de vérifier, wifiInfo.getBSSID() renvoie null.

52
zmbq

J'écoute WifiManager.NETWORK_STATE_CHANGED_ACTION dans un récepteur de diffusion

if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals (action)) {
        NetworkInfo netInfo = intent.getParcelableExtra (WifiManager.EXTRA_NETWORK_INFO);
        if (ConnectivityManager.TYPE_WIFI == netInfo.getType ()) {

Je vérifie netInfo.isConnected (). Ensuite, je peux utiliser

WifiManager wifiManager = (WifiManager) getSystemService (Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo ();
String ssid  = info.getSSID();

MISE À JOUR

À partir de Android 8.0 et ultérieur, nous n'obtiendrons pas le SSID du réseau connecté à moins que le GPS ne soit activé.

85
Eric Woodruff

À partir de Android 8.1 (API 27), les applications doivent disposer de l'autorisation ACCESS_COARSE_LOCATION (Ou ACCESS_FINE_LOCATION) Pour obtenir les résultats de WifiInfo.getSSID() ou WifiInfo.getBSSID().

Cette autorisation est également nécessaire pour obtenir les résultats de WifiManager.getConnectionInfo() et WifiManager.getScanResults() bien qu'il ne soit pas clair s'il s'agit d'une nouveauté 8.1 ou si elle était requise auparavant.

Source : "Les identifiants BSSID/SSID peuvent être utilisés pour déterminer un emplacement. Vous devez donc disposer des mêmes autorisations d'accès pour accéder aux champs WifiInfo demandés à l'aide de WifiManager.getConnectionInfo () comme pour WifiManager.getScanResults ()."

46
mike47

Si vous ne voulez pas faire de Broadcast Receiver, essayez simplement

WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo;

wifiInfo = wifiManager.getConnectionInfo();
if (wifiInfo.getSupplicantState() == SupplicantState.COMPLETED) {
    ssid = wifiInfo.getSSID();
}

N'oubliez pas que chaque fois que l'utilisateur se déconnecte ou se connecte au nouveau SSID ou à un changement d'état du wifi, vous devez initialiser WifiInfo i.e wifiInfo = wifiManager.getConnectionInfo();

30
Pranav

J'ai trouvé une solution intéressante pour obtenir le SSID du Wifi AP actuellement connecté. Vous devez simplement utiliser iterate WifiManager.getConfiguredNetworks() et rechercher une configuration avec un objet spécifique WifiInfo.getNetworkId()

Mon exemple

dans le récepteur de diffusion avec l'action WifiManager.NETWORK_STATE_CHANGED_ACTION J'obtiens l'état de connexion actuel d'intention

NetworkInfo nwInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
nwInfo.getState()

Si NetworkInfo.getState est égal à NetworkInfo.State.CONNECTED alors je peux obtenir l'objet WifiInfo actuel

WifiManager wifiManager = (WifiManager) getSystemService (Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo ();

Et après ça

public String findSSIDForWifiInfo(WifiManager manager, WifiInfo wifiInfo) {

    List<WifiConfiguration> listOfConfigurations = manager.getConfiguredNetworks();

    for (int index = 0; index < listOfConfigurations.size(); index++) {
        WifiConfiguration configuration = listOfConfigurations.get(index);
        if (configuration.networkId == wifiInfo.getNetworkId()) {
            return configuration.SSID;
        }
    }

    return null;
}

Et chose très importante de cette méthode ne nécessite pas d'emplacement ou de permission d'emplacement

13
TomMannson

Dans Android 8.1, il est impératif d'activer Emplacement pour obtenir le SSID. Sinon, vous pouvez obtenir l'état de la connexion mais pas le SSID.

WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = null;
if (wifiManager != null) 
wifiInfo = wifiManager.getConnectionInfo();
 String ssid = null;
if (wifiInfo != null) 
ssid = wifiInfo.getSSID(); /*you will get SSID <unknown ssid> if location turned off*/
5
user3143487

Ceci fait suite à la réponse donnée par @EricWoodruff.

Vous pouvez utiliser netInfo's getExtraInfo() pour obtenir le SSID wifi.

if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals (action)) {
    NetworkInfo netInfo = intent.getParcelableExtra (WifiManager.EXTRA_NETWORK_INFO);
    if (ConnectivityManager.TYPE_WIFI == netInfo.getType ()) {
        String ssid = info.getExtraInfo()
        Log.d(TAG, "WiFi SSID: " + ssid)
    }
}

Si vous n'utilisez pas BroadcastReceiver, vérifiez this answer pour obtenir le SSID en utilisant Context

Ceci est testé sur Android Oreo 8.1.0

3
Yaswant Narayan