当我的Android设备连接到WIFI时,我正在尝试获取WIFI网络的SSID .
我已经注册了一个BroadcastReceiver,正在监听 android.net.wifi.supplicant.CONNECTION_CHANGE
. 我在WIFI断开连接或重新连接时收到通知 . 不幸的是,我可以't get the network'的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?在 Build 连接之前,广播是否提早播出?我应该听另一个广播吗?我只对WIFI连接感兴趣,而不是3G连接 .
更新:我刚检查过, wifiInfo.getBSSID()
返回null .
6 回答
在Android 8.1中,必须将位置打开以获取SSID,否则您可以获得连接状态但不能获得SSID
这是对@EricWoodruff给出的答案的跟进 .
您可以使用
netInfo
的getExtraInfo()
获取wifi SSID .如果您没有使用BroadcastReceiver,请使用
Context
检查this answer以获取SSID这是在Android Oreo 8.1.0上测试的
如果已连接,请通过NetworkInfo检查wifi类型 . 然后使用wifiinfo getSSid() . 您可能希望从返回的SSID中删除双斜杠
https://play.google.com/store/apps/details?id=com.connect.freewifi
你应该从http://developer.android.com/reference/android/net/wifi/WifiInfo.html查看这个应用程序和开发人员api
它将帮助您完成任务 .
我在广播接收器中监听WifiManager.NETWORK_STATE_CHANGED_ACTION
我检查netInfo.isConnected() . 然后我就可以使用了
UPDATE
从Android 8.0开始,除非打开GPS,否则我们不会获得连接网络的SSID .
从Android 8.1(API 27)开始,必须为应用授予
ACCESS_COARSE_LOCATION
(或ACCESS_FINE_LOCATION
)权限才能从WifiInfo.getSSID()
或WifiInfo.getBSSID()
获取结果 .获取
WifiManager.getConnectionInfo()
和WifiManager.getScanResults()
的结果也需要此权限,但不清楚这是8.1中的新内容还是以前需要的 .Source:"BSSID/SSID can be used to deduce location, so require the same location permissions for access to these WifiInfo fields requested using WifiManager.getConnectionInfo() as for WifiManager.getScanResults()."
如果您不想制作广播接收器那么简单一试
请记住每次用户断开连接或连接到新的SSID或任何wifi状态更改时,您需要初始化WifiInfo,即
wifiInfo = wifiManager.getConnectionInfo();