Je dois vérifier le SSID wifi connecté actuel sur Android. J'ai vérifié avec Nokia 6 et OnePlus 5 avec respectivement Oreo 8.1.0 et Oreo 8.0. D'autres téléphones avec des versions de système d'exploitation différentes fonctionnent correctement avec ce code. Y a-t-il un problème avec mon code?
private WifiInfo wifiInfo;
private String ssid = "";
private WifiManager wifiManager;
private boolean getWifiStatus() {
wifiManager= (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifiInfo = wifiManager.getConnectionInfo();
ssid = "";
ssid = wifiInfo.getSSID();
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isWiFi = false;
if(activeNetwork != null){
isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
}
Log.d(TAG, "getWifiStatus: " + ssid);
if(ssid.contains("TripleMZim") && wifiManager.isWifiEnabled() && isWiFi ){
return true;
}
else{
return false;
}
}
permission dans le fichier manifeste:
<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE"/>
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission Android:name="Android.permission.INTERNET"/>
Les périphériques Oreo 8.1+ nécessitent l'utilisation de l'autorisation d'exécution grossière pour l'emplacement ainsi que les services de localisation avant de pouvoir récupérer le SSID connecté, car il peut en déduire l'emplacement des utilisateurs.
Des informations complémentaires sont disponible ici
Ce qui concerne this
Dans Android Oreo, vous pouvez utiliser ConnectivityManager
pour connaître votre SSID wifi.
Autorisation
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
Code pour obtenir le SSID
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info != null && info.isConnected()) {
String ssid = info.getExtraInfo();
Log.d(TAG, "WiFi SSID: " + ssid);
}
Ceci est testé dans Android Oreo 8.1.0. Vous obtiendrez le SSID entre guillemets doubles.
Il existe différentes approches pour obtenir les informations WIFI (telles que le SSID) dans Android.
Certains d'entre eux sont déjà listés ci-dessus, par exemple WifiManager service.
Mais pour la question OP:
Y a-t-il un problème avec mon code?
Non, le problème ne réside pas dans votre code. La principale raison du comportement inattendu est le correctif de sécurité des dernières versions d'Android.
Avant le correctif (ou tout autre appareil n'ayant pas reçu de mise à jour), les pirates pouvaient voler des informations sensibles qui avaient été divulguées via les informations de connexion Wi-Fi.
Par exemple, les pirates pourraient obtenir la géolocalisation de l'appareil, qui devrait être accessible uniquement avec le Dangerous PermissionLOCATION , qui devrait être demandé à l'exécution et peut être révoqué à tout moment. Mais dans l’autre - le WifiInfo
n’est accessible qu’avec le Permission normaleAndroid.permission.ACCESS_WIFI_STATE
qui est accordé au moment de l’installation et ne peut pas être révoqué . De cette façon, les pirates pourraient contourner complètement le mécanisme les données de la permission dangereuse en utilisant seulement la permission normale.
Le problème a été signalé et suivi par CVE-2018-9489
, vous pouvez en savoir plus à ce sujet ici: Des informations sensibles sont exposées via WIFI
Donc, la raison pour laquelle vous rencontrez ces problèmes est qu’Android bloque désormais les informations sensibles du Wi-Fi, à moins que l’application ne contienne le ACCESS_COARSE_LOCATION
ou le ACCESS_FINE_LOCATION
.
Donc, si vous demandez explicitement ces autorisations (et que l'utilisateur le permet), votre code devrait fonctionner correctement.
Par exemple:
Manifeste
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE"/>
Activité
private static final int LOCATION = 1;
protected void onStart() {
super.onStart();
//Assume you want to read the SSID when the activity is started
tryToReadSSID();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if(grantResults[0] == PackageManager.PERMISSION_GRANTED && requestCode == LOCATION){
//User allowed the location and you can read it now
tryToReadSSID();
}
}
private void tryToReadSSID() {
//If requested permission isn't Granted yet
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
//Request permission from user
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION);
}else{//Permission already granted
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
if(wifiInfo.getSupplicantState() == SupplicantState.COMPLETED){
String ssid = wifiInfo.getSSID();//Here you can access your SSID
System.out.println(ssid);
}
}
}
Vous devez demander une autorisation dans le manifeste:
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
et le demander dans votre activité:
private void grantPermm()
{
try
{
if (ContextCompat.checkSelfPermission(MainScreenActivity.this,
Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
{
}
else
{
ActivityCompat.requestPermissions(MainScreenActivity.this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
101);
}
}
catch (Exception xx){}
}
puis utilisez cette fonction:
public static String getWifiName(Context context)
{
String result="";
try {
WifiManager manager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if (manager.isWifiEnabled())
{
WifiInfo wifiInfo = manager.getConnectionInfo();
if (wifiInfo != null)
{
NetworkInfo.DetailedState state = WifiInfo.getDetailedStateOf(wifiInfo.getSupplicantState());
if (state == NetworkInfo.DetailedState.CONNECTED || state == NetworkInfo.DetailedState.OBTAINING_IPADDR)
{
result = wifiInfo.getSSID();
if(result.equalsIgnoreCase("<unknown ssid>"))
{
Toast.makeText(context,"You are connected to mobile data", Toast.LENGTH_SHORT).show();
result="";
}
return result;
}
else
{
Toast.makeText(context,"WIFI not connected", Toast.LENGTH_SHORT).show();
return "";
}
}
else
{
Toast.makeText(context,"No WIFI Information", Toast.LENGTH_SHORT).show();
return "";
}
}
else
{
Toast.makeText(context,"WIFI not enabled", Toast.LENGTH_SHORT).show();
return "";
}
}
catch (Exception xx)
{
Toast.makeText(context, xx.getMessage().toString(), Toast.LENGTH_SHORT).show();
return "";
}
}
Si vous rencontrez des problèmes même après avoir essayé les réponses Yaswant Narayan et behelit, assurez-vous que vous avez activé la localisation/GPS dans l'appareil tout en essayant d'obtenir le SSID. Même si vous avez acquis les autorisations appropriées dans les appareils Android Oreo et versions ultérieures, si l'emplacement/GPS est désactivé par l'utilisateur, vous obtiendrez le de ces appareils.