连接WiFi时获取SSID



当我的Android设备连接到WiFi时,我正在尝试获取WiFi网络的SSID。

我已经注册了一名Broadcastreceiver for 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连接。

更新:我刚刚检查, wifiInfo.getBSSID()返回null。

我在广播接收器中听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) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo();
String ssid  = info.getSSID();

update

从Android 8.0开始,除非启用位置服务,并且您的应用程序有权访问它。

从Android 8.1(API 27)开始,必须授予应用程序ACCESS_COARSE_LOCATION(或ACCESS_FINE_LOCATION)权限,以便从WifiInfo.getSSID()WifiInfo.getBSSID()获得结果。必须授予目标API 29或更高(Android 10)的应用程序ACCESS_FINE_LOCATION

还需要此权限以从WifiManager.getConnectionInfo()WifiManager.getScanResults()获得结果

来源:" 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,即wifiInfo = wifiManager.getConnectionInfo();

我找到了有趣的解决方案,以获取当前连接的WiFi AP的SSID。您只需要使用迭代WifiManager.getConfiguredNetworks()并找到具有特定WifiInfo.getNetworkId()

的配置

我的示例

在Action 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;
}

和非常重要的事情此方法不需要位置或位置权限

在API29中Google重新设计的WiFi API,因此该解决方案已过时,用于Android 10。

在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给出的答案的后续。

您可以使用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

获得SSID

这是在Android Oreo 8.1.0

上测试的

在kotlin中答案给予权限

<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")
    }
}

对我而言,它只有在我在手机本身上设置许可时(设置 - &gt; app; app permissions - gt;位置始终开启)。

根据官方文档的说明,在Android 10 上(API 29及更高),声明ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION权限还不够。

1。对于前景位置:

您还需要在服务中声明locationforegroundServiceType以使用前景位置。

<service
    android:name="MyNavigationService"
    android:foregroundServiceType="location" ... >
    <!-- Any inner elements would go here. -->
</service>

或如果您的代码在活动中运行,则该活动应为用户可见。

2。对于背景位置:

您应该在应用程序清单中声明ACCESS_BACKGROUND_LOCATION许可,以便在运行时请求背景位置访问。

注意:Google Play商店有有关设备的位置策略位置,限制背景位置访问需要它的应用为了达到核心功能并满足相关政策要求。

官方文件:

https://developer.android.com/training/location/permissionshttps://developer.android.com/guide/topics/connectivity/wifi-scan#wifi-scan-permissions

android 9 ssid显示null值使用此代码。

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("^"|"$", "");
        }

最新更新