当我的Android设备连接到WIFI时,我正在尝试获取WIFI网络的SSID。
我已经注册了一个收听android.net.wifi.supplicant.CONNECTION_CHANGE
的BroadcastReceiver。当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。
答案 0 :(得分:79)
我在广播接收器中收听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。
答案 1 :(得分:43)
从Android 8.1(API 27)开始,必须为应用授予ACCESS_COARSE_LOCATION
(或ACCESS_FINE_LOCATION
)权限才能获得WifiInfo.getSSID()
或WifiInfo.getBSSID()
的结果。< / p>
要获得WifiManager.getConnectionInfo()
和WifiManager.getScanResults()
的结果,还需要此权限,但不清楚这是8.1中的新内容还是以前需要的。
Source:&#34; BSSID / SSID可用于推断位置,因此需要相同 访问这些WifiInfo字段的位置权限 请求使用WifiManager.getConnectionInfo() 。WifiManager.getScanResults()&#34;
答案 2 :(得分:27)
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();
答案 3 :(得分:9)
我找到了一个有趣的解决方案来获取当前连接的Wifi AP的SSID。
您只需要使用迭代WifiManager.getConfiguredNetworks()
并使用特定的WifiInfo.getNetworkId()
我的例子
在广播接收器中,其操作为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;
}
非常重要的一点是,此方法不需要Location或Location 渗透
答案 4 :(得分:4)
在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*/
答案 5 :(得分:3)
这是@EricWoodruff给出的答案的后续措施。
您可以使用netInfo
的{{1}}来获取WiFi SSID。
getExtraInfo()
如果您未使用BroadcastReceiver,请检查this答案以使用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)
}
}
来获取SSID
这已在Android Oreo 8.1.0上进行了测试
答案 6 :(得分:1)
科特林的答案 授予权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
private fun getCurrentNetworkDetail() {
val connManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
if (networkInfo.isConnected) {
val wifiManager =
context.getApplicationContext().getSystemService(Context.WIFI_SERVICE) as WifiManager
val connectionInfo = wifiManager.connectionInfo
if (connectionInfo != null && !TextUtils.isEmpty(connectionInfo.ssid)) {
Log.e("ssid", connectionInfo.ssid)
}
}
else{
Log.e("ssid", "No Connection")
}
}
答案 7 :(得分:0)
对我来说,它仅在我设置手机本身的权限时有效(设置->应用程序权限->位置始终为开)。
答案 8 :(得分:-1)
如果已连接,请通过NetworkInfo检查wifi类型。 然后使用wifiinfo getSSid()。您可能希望从returnnd SSID
中删除双斜杠https://play.google.com/store/apps/details?id=com.connect.freewifi
您应该查看此应用程序和开发人员api http://developer.android.com/reference/android/net/wifi/WifiInfo.html
它将帮助您完成任务。
答案 9 :(得分:-2)
显示NULL值的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("^\"|\"$", "");
}