Получить 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
Это поможет вам с вашей задачей.