android-连接WIFI时获取SSID
当我的android设备连接到WIFI时,我试图获取WIFI网络的SSID。
我已经注册了一个BroadcastReceiver,用于监听wifiInfo.getBSSID()。 WIFI断开或重新连接时,我会收到通知。 不幸的是,我无法获得网络的SSID。
我正在使用以下代码查找SSID:
WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String ssid = wifiInfo.getSSID();
取回字符串2673771322295190190528,而不是SSID。
这些是清单中的权限(我添加了ACCESS_NETWORK_STATE只是为了检查,实际上我并不需要它)
为什么会这样? 如何获得实际的SSID? 建立连接之前,广播是否会提前播放? 还有我应该听的广播吗? 我只对WIFI连接感兴趣,对3G连接不感兴趣。
更新:我刚刚检查过,wifiInfo.getBSSID()返回null。
zmbq asked 2019-12-25T20:48:42Z
7个解决方案
89 votes
我在广播接收器中收听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开始,除非打开GPS,否则我们将不会获得所连接网络的SSID。
Eric Woodruff answered 2019-12-25T20:49:13Z
46 votes
从Android 8.1(API 27)开始,必须为应用授予WifiManager.getConnectionInfo()(或WifiManager.getScanResults())权限,以便从WifiInfo.getSSID()或WifiInfo.getBSSID()获得结果。
要获得WifiManager.getConnectionInfo()和WifiManager.getScanResults()和WifiManager.getScanResults()的结果,还需要获得此许可,尽管尚不清楚这是8.1中的新增功能还是以前的要求。
来源:“ BSSID / SSID可用于推断位置,因此要求相同访问这些WifiInfo字段的位置权限使用WifiManager.getConnectionInfo()请求WifiManager.getScanResults()。”
mike47 answered 2019-12-25T20:49:43Z
30 votes
如果您不想制作广播接收器,请简单尝试
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo;
wifiInfo = wifiManager.getConnectionInfo();
if (wifiInfo.getSupplicantState() == SupplicantState.COMPLETED) {
ssid = wifiInfo.getSSID();
}
记住每次用户断开连接或连接到新的SSID或任何wifi状态更改时,都需要初始化WifiInfo,即wifiInfo = wifiManager.getConnectionInfo();
Pranav answered 2019-12-25T20:50:07Z
13 votes
我找到了一个有趣的解决方案来获取当前连接的Wifi AP的SSID。您只需要使用迭代NetworkInfo.getState并找到具有特定NetworkInfo.State.CONNECTED的配置
我的例子
在广播接收器中,动作为NetworkInfo.getState我正在从意图中获取当前的连接状态
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 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;
}
而且非常重要的一点是,此方法不需要“位置”即可权限
TomMannson answered 2019-12-25T20:50:50Z
5 votes
在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 if location turned off*/
user3143487 answered 2019-12-25T20:51:10Z
3 votes
这是@EricWoodruff给出的答案的后续措施。
您可以使用Context的getExtraInfo()来获取WiFi SSID。
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,请检查此答案以使用Context获得SSID
这已在Android Oreo 8.1.0上进行了测试
Yaswant Narayan answered 2019-12-25T20:51:43Z
-2 votes
显示空值的Android 9 SSID使用此代码。
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("^\"|\"$", "");
}
Udhaya Sweetidiot answered 2019-12-25T20:52:03Z