连接WIFI时获取SSID

时间:2014-01-27 20:51:16

标签: android wifi ssid

当我的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。

10 个答案:

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