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