web-dev-qa-db-fra.com

Sur Oreo (8.1.0) ne pas obtenir le SSID Wifi correct. Il montre <inconnu ssid> bien qu'il soit connecté à un wifi avec SSID

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

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

5
behelit

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.

8
Yaswant Narayan

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);
        }
    }
}
6
Nikita Kurtin

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 "";
    }
}
1
Osama Ibrahim

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.

0
venkat