wake-up-neo.com

Auf Oreo (8.1.0) wird die korrekte WLAN-SSID nicht angezeigt. Es zeigt <unbekannte ssid> an, obwohl es mit einem WLAN mit SSID verbunden ist

Ich muss die aktuelle WLAN-SSID unter Android überprüfen. Ich habe mit Nokia 6 und OnePlus 5 mit Oreo 8.1.0 bzw. Oreo 8.0 überprüft. Andere Telefone mit unterschiedlichen Betriebssystemversionen funktionieren mit diesem Code einwandfrei. Stimmt mein Code nicht?

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;
    }
}

erlaubnis in Manifest-Datei:

<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

Für Oreo 8.1+ -Geräte müssen die Berechtigung für die grobe Standortlaufzeit sowie Standortdienste aktiviert sein, bevor die verbundene SSID abgerufen werden kann, da der Standort des Benutzers ermittelt werden kann.

Weitere Informationen sind hier verfügbar

Was sich auf this bezieht

5
behelit

In Android Oreo können Sie ConnectivityManager verwenden, um Ihre WLAN-SSID zu ermitteln. 

Genehmigung

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

Code zum Abrufen der 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);
}

Dies wurde in Android Oreo 8.1.0 getestet. Sie erhalten eine SSID mit doppelten Anführungszeichen.

8
Yaswant Narayan

Es gibt verschiedene Ansätze, wie Sie die WIFI-Informationen (z. B. SSID) in Android abrufen können.

Einige davon sind oben bereits aufgeführt, zum Beispiel WifiManager service.

Aber für OP-Frage:

Stimmt mein Code nicht?

Nein, das Problem liegt nicht in Ihrem Code. Der Hauptgrund für das unerwartete Verhalten ist auf das Sicherheitspatch der letzten Android-Versionen zurückzuführen. 

Vor dem Patch (oder einem Gerät, das kein Update erhalten hat) konnten die Hacker vertrauliche Informationen stehlen, die durch die WLAN-Informationen durchgesickert wurden. 

Beispielsweise könnten die Hacker die Geolocation des Geräts erhalten, auf die nur mit dem Dangerous Permission_ORT zugegriffen werden sollte, die zur Laufzeit angefordert werden sollte und jederzeit widerrufen werden kann. Andererseits ist die WifiInfo nur mit der Normal PermissionAndroid.permission.ACCESS_WIFI_STATE zugänglich, die zum Installationszeitpunkt erteilt wird und nicht widerrufen werden kann. Auf diese Weise können Hacker den Berechtigungsmechanismus und den Zugriff vollständig umgehen die Daten von gefährlichen Erlaubnis nur mit normaler Erlaubnis.

Das Problem wurde von CVE-2018-9489 gemeldet und verfolgt. Weitere Informationen hierzu finden Sie hier: Vertrauliche Informationen werden über WIFI verfügbar gemacht

Der Grund, warum Sie diese Probleme haben, ist deshalb, weil Android jetzt die sensiblen WLAN-Informationen blockiert, es sei denn, die App enthält den ACCESS_COARSE_LOCATION oder ACCESS_FINE_LOCATION.

Wenn Sie diese Berechtigungen explizit anfordern (und vom Benutzer zugelassen werden), sollte Ihr Code einwandfrei funktionieren.

Zum Beispiel:

Manifest

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

Aktivität

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

Sie müssen die Erlaubnis im Manifest anfordern:

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

und fordere es in deiner Aktivität an:

    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){}

}

dann benutzen Sie diese Funktion:

    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

Wenn Sie auf API 29 (Android 10) abzielen, muss die angeforderte Standortberechtigung jetzt ACCESS_FINE_LOCATION und nicht nur ACCESS_COARSE_LOCATION lauten. Der größte Teil des obigen Beispielcodes ist in Ordnung, jedoch können einige Antworten im Text irreführend sein.

https://developer.Android.com/about/versions/10/privacy/changes

0
Nicholas Hardy

Wenn Sie Probleme haben, nachdem Sie die Antworten von Yaswant Narayan ausprobiert haben und sich verhalten haben, stellen Sie sicher, dass Sie die Position/GPS im Gerät aktiviert haben, während Sie versuchen, die SSID abzurufen. Obwohl Sie die entsprechenden Berechtigungen für Android Oreo und andere Geräte erworben haben, wird der Standort bzw. das GPS-Gerät vom Benutzer deaktiviert, und Sie erhalten die entsprechenden Berechtigungen.

0
venkat

Sie müssen die Laufzeitberechtigung zum Lesen des Telefonstatus anfordern. Dies dient der besseren Sicherheit.

code lautet wie folgt: -

    TelephonyManager telephonyManager = (TelephonyManager) getContext()
            .getSystemService(Context.TELEPHONY_SERVICE);

    String IMEI ="";

    if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
       ActivityCompat.requestPermissions(getActivity(),
               new String[]{Manifest.permission.READ_PHONE_STATE},
               123);

    }
    int permission = ContextCompat.checkSelfPermission(getContext(),
            Manifest.permission.READ_PHONE_STATE);
    if(permission == PackageManager.PERMISSION_GRANTED){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            IMEI = telephonyManager.getImei();
        }
        else{
            IMEI = telephonyManager.getDeviceId();
        }
    }
0
Abhishek Kumar