Получить 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-соединения.

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

6 ответов


Я слушаю 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 не включен.


начиная с 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 ()."


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

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();


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

это в ответ @EricWoodruff.

вы могли бы использовать netInfo ' s getExtraInfo() чтобы получить SSID wifi.

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


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

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

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

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