Android 连接WIFI时获取SSID

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21391395/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 04:28:31  来源:igfitidea点击:

Get SSID when WIFI is connected

androidwifissid

提问by zmbq

I'm trying to get the SSID of the WIFI network when my android device is connected to WIFI.

当我的 android 设备连接到 WIFI 时,我试图获取 WIFI 网络的 SSID。

I've registered a BroadcastReceiver listening for android.net.wifi.supplicant.CONNECTION_CHANGE. I get the notification when WIFI is disconnected or reconnected. Unfortunately, I can't get the network's SSID.

我已经注册了一个 BroadcastReceiver 监听android.net.wifi.supplicant.CONNECTION_CHANGE. 当 WIFI 断开或重新连接时,我会收到通知。不幸的是,我无法获得网络的 SSID。

I'm using the following code to find the SSID:

我正在使用以下代码来查找 SSID:

WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String ssid = wifiInfo.getSSID();

Instead of the SSID, I get the string <unknown ssid>back.

我取回了字符串,而不是 SSID <unknown ssid>

These are the permissions in the manifest (I've added ACCESS_NETWORK_STATE just to check, I don't actually need it)

这些是清单中的权限(我添加了 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"/>

Why does this happen? How can I get the actual SSID? Is the broadcast fired to early, before the connection is established? Is there another broadcast I should listen to? I'm only interested in WIFI connections, not 3G connections.

为什么会发生这种情况?我怎样才能获得实际的 SSID?在建立连接之前,广播是否提前触发?还有其他广播我应该听吗?我只对 WIFI 连接感兴趣,对 3G 连接不感兴趣。

Update: I just checked, wifiInfo.getBSSID()returns null.

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

回答by Eric Woodruff

I listen for WifiManager.NETWORK_STATE_CHANGED_ACTION in a broadcast receiver

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

I check for netInfo.isConnected (). Then I am able to use

我检查了 netInfo.isConnected()。然后我就可以使用

WifiManager wifiManager = (WifiManager) getSystemService (Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo ();
String ssid  = info.getSSID();

UPDATE

更新

From android 8.0 onwards we wont be getting SSID of the connected network unless GPS is turned on.

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

回答by mike47

Starting with Android 8.1 (API 27), apps must be granted the ACCESS_COARSE_LOCATION(or ACCESS_FINE_LOCATION) permission in order to obtain results from WifiInfo.getSSID()or WifiInfo.getBSSID(). Apps that target API 29 or higher (Android 10) must be granted ACCESS_FINE_LOCATION.

从 Android 8.1 (API 27) 开始,应用必须获得ACCESS_COARSE_LOCATION(或ACCESS_FINE_LOCATION) 权限才能从WifiInfo.getSSID()或获取结果WifiInfo.getBSSID()。必须授予面向 API 29 或更高版本 (Android 10) 的应用程序ACCESS_FINE_LOCATION

This permission is also needed to obtain results from WifiManager.getConnectionInfo()and WifiManager.getScanResults()although it is not clear if this is new in 8.1 or was required previously.

虽然尚不清楚这是 8.1 中的新功能还是之前的要求WifiManager.getConnectionInfo()WifiManager.getScanResults()但也需要此权限才能从和 中获取结果。

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

来源:“BSSID/SSID 可用于推断位置,因此使用 WifiManager.getConnectionInfo() 请求访问这些 WifiInfo 字段需要与 WifiManager.getScanResults() 相同的位置权限。”

回答by Pranav

If you don't want to make Broadcast Receiver then simple try

如果你不想制作广播接收器,那么简单的尝试

WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo;

wifiInfo = wifiManager.getConnectionInfo();
if (wifiInfo.getSupplicantState() == SupplicantState.COMPLETED) {
    ssid = wifiInfo.getSSID();
}

Remember every time user disconnect or connect to new SSID or any wifi state change then you need to initialize WifiInfo i.e wifiInfo = wifiManager.getConnectionInfo();

请记住,每次用户断开连接或连接到新的 SSID 或任何 wifi 状态更改时,您都需要初始化 WifiInfo,即 wifiInfo = wifiManager.getConnectionInfo();

回答by TomMannson

I found interesting solution to get SSID of currently connected Wifi AP. You simply need to use iterate WifiManager.getConfiguredNetworks()and find configuration with specific WifiInfo.getNetworkId()

我找到了有趣的解决方案来获取当前连接的 Wifi AP 的 SSID。您只需要使用 iterateWifiManager.getConfiguredNetworks()并找到特定的配置WifiInfo.getNetworkId()

My example

我的例子

in Broadcast receiver with action WifiManager.NETWORK_STATE_CHANGED_ACTIONI'm getting current connection state from intent

在带有操作的广播接收器中,WifiManager.NETWORK_STATE_CHANGED_ACTION我从意图中获取当前连接状态

NetworkInfo nwInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
nwInfo.getState()

If NetworkInfo.getStateis equal to NetworkInfo.State.CONNECTEDthen i can get current WifiInfo object

如果NetworkInfo.getState等于NetworkInfo.State.CONNECTED那么我可以获得当前的 WifiInfo 对象

WifiManager wifiManager = (WifiManager) getSystemService (Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo ();

And after that

在那之后

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

And very important thing this method doesn't require Location nor Location Permisions

非常重要的是,此方法不需要位置或位置权限

In API29 Google redesigned Wifi API so this solution is outdated for Android 10.

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

回答by user3143487

In Android 8.1 it is must to turned Location on to get SSID, if not you can get connection state but not SSID

在 Android 8.1 中,必须打开 Location 才能获取 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*/

回答by Yaswant Narayan

This is a follow up to the answer given by @EricWoodruff.

这是@EricWoodruff 给出的答案的后续。

You could use netInfo's getExtraInfo()to get wifi SSID.

您可以使用netInfo'sgetExtraInfo()来获取 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)
    }
}

If you are not using BroadcastReceiver check thisanswer to get SSID using Context

如果您不使用 BroadcastReceiver 检查答案以获取 SSID 使用Context

This is tested on Android Oreo 8.1.0

这是在 Android Oreo 8.1.0 上测试的

回答by RanaUmer

Answer In Kotlin Give Permissions

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

}

回答by Udhaya Sweetidiot

Android 9 SSID showing NULL values use this code..

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