web-dev-qa-db-fra.com

Comment obtenir le SSID WIFI dans Android 9.0 (PIE)?

Comment obtenir le SSID WIFI dans Android 9.0 (PIE)? Mon code fonctionne correctement jusqu'à Android version 8.1.0 mais il ne fonctionne pas sur Android 9.0

ConnectivityManager connManager = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if (networkInfo.isConnected()) {
            WifiManager wifiManager = (WifiManager) activity.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            wifiInfo.getSSID();
            String name = networkInfo.getExtraInfo();
            String ssid = "\"" + wifiInfo.getSSID() + "\"";
}

Mais ce code ne fonctionne pas sur Android 9.0

6
Abhinav Tiwari

Les modifications d'Android version 9 (Pie) nécessitent l'activation de l'emplacement (par l'utilisateur), ou l'appel à getConnectioInfo () échouera, même si votre application dispose des autorisations appropriées. Ceci est documenté dans le modifications d'Android 9 (extrait ci-dessous):


Accès restreint aux informations de localisation et de connexion Wi-Fi

Dans Android 9, les conditions d'autorisation pour qu'une application effectue des analyses Wi-Fi sont plus strictes que dans les versions précédentes. Pour plus de détails, voir Restrictions de l'analyse Wi-Fi.

Des restrictions similaires s'appliquent également à la méthode getConnectionInfo (), qui renvoie un objet WifiInfo décrivant la connexion Wi-Fi actuelle. Vous ne pouvez utiliser les méthodes de cet objet pour récupérer les valeurs SSID et BSSID que si l'application appelante dispose des autorisations suivantes:

  • ACCESS_FINE_LOCATION ou ACCESS_COARSE_LOCATION
  • ACCESS_WIFI_STATE

La récupération du SSID ou du BSSID nécessite également l'activation des services de localisation sur l'appareil (sous Paramètres> Emplacement).


Dans mon cas, j'appelle la fonction ci-dessous (uniquement si elle fonctionne sur Android 9+) pour détecter si la localisation est activée, avant d'essayer de lire le SSID WIFI.

public static boolean isLocnEnabled(Context context) {
    List locnProviders = null;
    try {
        LocationManager lm =(LocationManager) context.getApplicationContext().getSystemService(Activity.LOCATION_SERVICE);
        locnProviders = lm.getProviders(true);

        return (locnProviders.size() != 0);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (BuildConfig.DEBUG) {
            if ((locnProviders == null) || (locnProviders.isEmpty()))
                Log.d(TAG, "Location services disabled");
            else
                Log.d(TAG, "locnProviders: " + locnProviders.toString());
        }
    }
    return(false);
}

Si la localisation n'est pas activée, j'ouvre une boîte de dialogue qui indique qu'elle est requise et permet à l'utilisateur de passer à la page des paramètres de localisation (voir le code ci-dessous):

context.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
9
gOnZo

Ceci est lié aux autorisations .... depuis le niveau 27 de l'API, vous avez besoin de ACCESS_FINE_LOCATION ou ACCESS_COARSE_LOCATION autorisation. Vous devrez peut-être également CHANGE_WIFI_STATE pour Android 9 (c'est le cas pour le scan wifi de toute façon selon https://developer.Android.com/guide/topics/connectivity/wifi-scan )

1
John O'Reilly

Vous pouvez accéder au ssid wifi auquel vous y êtes connecté dans Android 8 avec autorisation de localisation, mais dans Android 9 vous devez activer la localisation. Lire plus ici: https://developer.Android.com/about/versions/pie/Android-9.0-changes-all

0
Mohammad Davari