it-swarm.com.de

Holen Sie sich SSID, wenn WIFI verbunden ist

Ich versuche, die SSID des WIFI-Netzwerks abzurufen, wenn mein Android Gerät mit WIFI verbunden ist.

Ich habe einen BroadcastReceiver registriert, der auf Android.net.wifi.supplicant.CONNECTION_CHANGE Wartet. Ich erhalte die Benachrichtigung, wenn die WLAN-Verbindung getrennt oder wieder hergestellt wird. Leider kann ich die SSID des Netzwerks nicht ermitteln.

Ich benutze den folgenden Code, um die SSID zu finden:

WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String ssid = wifiInfo.getSSID();

Anstelle der SSID erhalte ich den String <unknown ssid> zurück.

Dies sind die Berechtigungen im Manifest (Ich habe ACCESS_NETWORK_STATE hinzugefügt, nur um zu überprüfen, ich brauche es nicht wirklich)

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

Warum passiert das? Wie kann ich die tatsächliche SSID erhalten? Wird die Sendung zu früh ausgelöst, bevor die Verbindung hergestellt ist? Gibt es eine andere Sendung, die ich hören sollte? Ich interessiere mich nur für WIFI-Verbindungen, nicht für 3G-Verbindungen.

Update: Ich habe gerade geprüft, dass wifiInfo.getBSSID() null zurückgibt.

52
zmbq

Ich höre auf WifiManager.NETWORK_STATE_CHANGED_ACTION in einem Rundfunkempfänger

if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals (action)) {
        NetworkInfo netInfo = intent.getParcelableExtra (WifiManager.EXTRA_NETWORK_INFO);
        if (ConnectivityManager.TYPE_WIFI == netInfo.getType ()) {

Ich überprüfe auf netInfo.isConnected (). Dann kann ich nutzen

WifiManager wifiManager = (WifiManager) getSystemService (Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo ();
String ssid  = info.getSSID();

UPDATE

Ab Android 8.0) erhalten wir keine SSID des verbundenen Netzwerks, es sei denn, GPS ist eingeschaltet.

85
Eric Woodruff

Beginnend mit Android 8.1 (API 27)) müssen Apps die Berechtigung ACCESS_COARSE_LOCATION (Oder ACCESS_FINE_LOCATION) Erhalten, um Ergebnisse von WifiInfo.getSSID() zu erhalten. oder WifiInfo.getBSSID().

Diese Berechtigung wird auch benötigt, um Ergebnisse von WifiManager.getConnectionInfo() und WifiManager.getScanResults() zu erhalten, obwohl nicht klar ist, ob dies neu in 8.1 ist oder zuvor erforderlich war.

Source : "BSSID/SSID kann zum Ableiten des Standorts verwendet werden. Daher sind für den Zugriff auf diese mit WifiManager.getConnectionInfo () angeforderten WifiInfo-Felder dieselben Standortberechtigungen erforderlich wie für WifiManager.getScanResults ()."

46
mike47

Wenn Sie Broadcast Receiver nicht erstellen möchten, versuchen Sie es einfach

WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo;

wifiInfo = wifiManager.getConnectionInfo();
if (wifiInfo.getSupplicantState() == SupplicantState.COMPLETED) {
    ssid = wifiInfo.getSSID();
}

Denken Sie daran, dass Sie jedes Mal, wenn der Benutzer die Verbindung zu einer neuen SSID oder eine Änderung des WLAN-Status trennt oder herstellt, WifiInfo initialisieren müssen, d. H. wifiInfo = wifiManager.getConnectionInfo();.

30
Pranav

Ich habe eine interessante Lösung gefunden, um die SSID des aktuell verbundenen Wifi-AP zu erhalten. Sie müssen nur iterieren WifiManager.getConfiguredNetworks() verwenden und die Konfiguration mit bestimmten WifiInfo.getNetworkId() finden

Mein Beispiel

im Rundfunkempfänger mit Aktion WifiManager.NETWORK_STATE_CHANGED_ACTION Ich erhalte den aktuellen Verbindungsstatus aus Absicht

NetworkInfo nwInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
nwInfo.getState()

Ob NetworkInfo.getState entspricht NetworkInfo.State.CONNECTED dann kann ich aktuelles WifiInfo Objekt bekommen

WifiManager wifiManager = (WifiManager) getSystemService (Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo ();

Und danach

public String findSSIDForWifiInfo(WifiManager manager, WifiInfo wifiInfo) {

    List<WifiConfiguration> listOfConfigurations = manager.getConfiguredNetworks();

    for (int index = 0; index < listOfConfigurations.size(); index++) {
        WifiConfiguration configuration = listOfConfigurations.get(index);
        if (configuration.networkId == wifiInfo.getNetworkId()) {
            return configuration.SSID;
        }
    }

    return null;
}

Und sehr wichtig, diese Methode erfordert weder Standort noch Standortgenehmigungen

13
TomMannson

In Android 8.1 muss Location aktiviert sein, um die SSID zu erhalten. Andernfalls erhalten Sie den Verbindungsstatus, aber nicht die SSID

WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = null;
if (wifiManager != null) 
wifiInfo = wifiManager.getConnectionInfo();
 String ssid = null;
if (wifiInfo != null) 
ssid = wifiInfo.getSSID(); /*you will get SSID <unknown ssid> if location turned off*/
5
user3143487

Dies ist eine Fortsetzung der Antwort von @EricWoodruff.

Sie könnten netInfo 's getExtraInfo() verwenden, um eine WLAN-SSID zu erhalten.

if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals (action)) {
    NetworkInfo netInfo = intent.getParcelableExtra (WifiManager.EXTRA_NETWORK_INFO);
    if (ConnectivityManager.TYPE_WIFI == netInfo.getType ()) {
        String ssid = info.getExtraInfo()
        Log.d(TAG, "WiFi SSID: " + ssid)
    }
}

Wenn Sie BroadcastReceiver nicht verwenden, überprüfen Sie this , um die SSID mit Context abzurufen.

Dies ist auf Android Oreo 8.1.0 getestet

3
Yaswant Narayan