Получить SSID при подключении WIFI

Я пытаюсь получить SSID сети WIFI, когда мое устройство Android подключено к WIFI.

Я зарегистрировал прослушиватель BroadcastReceiver для android.net.wifi.supplicant.CONNECTION_CHANGE. Я получаю уведомление, когда WIFI отключен или повторно подключен. К сожалению, я не могу получить SSID сети.

Я использую следующий код для поиска SSID:

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

Вместо SSID я возвращаю строку <unknown ssid>.

Это разрешения в манифесте (я добавил ACCESS_NETWORK_STATE, чтобы проверить, я действительно не нуждаюсь в нем)

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

Почему это происходит? Как я могу получить фактический SSID? Является ли трансляция раньше, прежде чем соединение будет установлено? Есть ли еще одна трансляция, которую я должен слушать? Меня интересуют только соединения WIFI, а не соединения 3G.

Обновление: я только что проверил, wifiInfo.getBSSID() возвращает null.

Ответ 1

Я слушаю WifiManager.NETWORK_STATE_CHANGED_ACTION в широковещательном приемнике

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

Я проверяю netInfo.isConnected(). Тогда я могу использовать

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

ОБНОВИТЬ

Начиная с android 8.0, мы не будем получать SSID подключенной сети, если GPS не включен.

Ответ 2

Начиная с Android 8.1 (API 27), приложениям должно быть предоставлено разрешение ACCESS_COARSE_LOCATION (или ACCESS_FINE_LOCATION) для получения результатов от WifiInfo.getSSID() или WifiInfo.getBSSID().

Это разрешение также необходимо для получения результатов от WifiManager.getConnectionInfo() и WifiManager.getScanResults(), хотя неясно, является ли это новым в 8.1 или требуется ранее.

Источник:" BSSID/SSID можно использовать для вывода местоположения, поэтому требуется тот же разрешения доступа для доступа к этим полям WifiInfo запрашивается с использованием WifiManager.getConnectionInfo(), как для WifiManager.getScanResults(). "

Ответ 3

Если вы не хотите делать широковещательный приемник, попробуйте попробуйте

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

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

Помните каждый раз, когда пользователь отключается или подключается к новому SSID или любому изменению состояния wifi, тогда вам нужно инициализировать WifiInfo i.e wifiInfo = wifiManager.getConnectionInfo();

Ответ 4

Простой и простой способ.

public String getWifiName(Context context) {
    WifiManager manager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    if (manager.isWifiEnabled()) {
       WifiInfo wifiInfo = manager.getConnectionInfo();
       if (wifiInfo != null) {
          DetailedState state = WifiInfo.getDetailedStateOf(wifiInfo.getSupplicantState());
          if (state == DetailedState.CONNECTED || state == DetailedState.OBTAINING_IPADDR) {
              return wifiInfo.getSSID();
          }
       }
    }
    return null;
}

Ответ 5

В Android 8.1 необходимо включить Location on для получения SSID, если вы не можете получить состояние соединения, но не 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*/

Ответ 6

Это последует за ответом @EricWoodruff.

Вы можете использовать netInfo getExtraInfo() для получения SSID Wi-Fi.

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

Если вы не используете BroadcastReceiver, проверьте этот ответ, чтобы получить SSID с помощью Context

Это проверено на Android Oreo 8.1.0

Ответ 7

Проверить через NetworkInfo для wifi-типа, если он подключен. А затем используйте wifiinfo getSSid(). Возможно, вы захотите удалить двойные косые черты из идентификатора SSID returnd

https://play.google.com/store/apps/details?id=com.connect.freewifi

Вы должны проверить это приложение и разработчика api из http://developer.android.com/reference/android/net/wifi/WifiInfo.html

Это поможет вам с вашей задачей.

Ответ 8

Я нашел интересное решение, чтобы получить SSID в настоящее время подключенного Wi-Fi AP. Вам просто нужно использовать итерацию WifiManager.getConfiguredNetworks() и найти конфигурацию с определенным WifiInfo.getNetworkId()

Мой пример

в Broadcast приемник с действием WifiManager.NETWORK_STATE_CHANGED_ACTION Я получаю текущее состояние соединения из намерения

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

Если NetworkInfo.getState равен NetworkInfo.State.CONNECTED тогда я могу получить текущий объект WifiInfo

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

И после этого

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

И очень важная вещь, этот метод не требует ни местоположения, ни разрешения на местоположение

Ответ 9

Android 9 SSID, показывающий значения NULL, использует этот код.

ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if (networkInfo.isConnected()) {
            WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            wifiInfo.getSSID();
            String name = networkInfo.getExtraInfo();
            String ssid = wifiInfo.getSSID();
            return ssid.replaceAll("^\"|\"$", "");
        }