首页 文章

连接WIFI时获取SSID

提问于
浏览
36

当我的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 回答

  • 65

    在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*/
    
  • 25

    这是对@EricWoodruff给出的答案的跟进 .

    您可以使用 netInfogetExtraInfo() 获取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 检查this answer以获取SSID

    这是在Android Oreo 8.1.0上测试的

  • 3

    如果已连接,请通过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

    它将帮助您完成任务 .

  • 32

    我在广播接收器中监听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();
    

    UPDATE

    从Android 8.0开始,除非打开GPS,否则我们不会获得连接网络的SSID .

  • 3

    从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()."

  • 0

    如果您不想制作广播接收器那么简单一试

    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();

相关问题