Получить 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("^\"|\"$", "");
}