连接WIFI时获取SSID

zmb*_*mbq 55 android ssid wifi

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

我注册了BroadcastReceiver 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();
Run Code Online (Sandbox Code Playgroud)

而不是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"/>
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我怎样才能获得实际的SSID?在建立连接之前,广播是否已提前播出?我应该听另一个广播吗?我只对WIFI连接感兴趣,而不是3G连接.

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

Eri*_*uff 90

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

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

WifiManager wifiManager = (WifiManager) getSystemService (Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo ();
String ssid  = info.getSSID();
Run Code Online (Sandbox Code Playgroud)

UPDATE

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

  • 你应该改变`WifiManager wifiManager =(WifiManager)getSystemService(Context.WIFI_SERVICE);`到`WifiManager wifiManager =(WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);`因为WiFiManager必须使用Application Context(不是Activity Context),否则可能发生内存泄漏. (7认同)
  • 那个更新很重要!即使拥有所有正确的权限,在实际打开 GPS 之前,您仍然会得到一个未知的 SSID!(仅在 Android 9 上测试) (3认同)

mik*_*e47 46

从Android 8.1(API 27)开始,必须为应用授予ACCESS_COARSE_LOCATION(或ACCESS_FINE_LOCATION)权限才能从WifiInfo.getSSID()或获取结果WifiInfo.getBSSID().

获得结果也需要此权限WifiManager.getConnectionInfo(),WifiManager.getScanResults()尽管不清楚这是8.1中的新内容还是之前需要的.

来源:"BSSID/SSID可用于推断位置,因此需要相同的位置权限才能访问使用WifiManager.getConnectionInfo()请求的WifiInfo字段,如WifiManager.getScanResults()."

  • 似乎与目标sdk无关的8.1+设备都需要这样做 (2认同)

Pra*_*nav 30

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

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

wifiInfo = wifiManager.getConnectionInfo();
if (wifiInfo.getSupplicantState() == SupplicantState.COMPLETED) {
    ssid = wifiInfo.getSSID();
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这看起来比接受的答案好得多.为什么在我们检查此信息(连接网络的SSID)的特定运行时可能实际上没有网络状态变化时,会听取网状态变化?我假设,由于getConnectionInfo上的文档,可能有WifiInfo可能为空,所以保护检查是由于恕我直言. (2认同)
  • 作品。只需设置权限:INTERNET,ACCESS_WIFI_STATE和位置权限:ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION (2认同)

Tom*_*son 13

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

我的例子

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

NetworkInfo nwInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
nwInfo.getState()
Run Code Online (Sandbox Code Playgroud)

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

WifiManager wifiManager = (WifiManager) getSystemService (Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo ();
Run Code Online (Sandbox Code Playgroud)

在那之后

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;
}
Run Code Online (Sandbox Code Playgroud)

而且非常重要的一点是,该方法不需要位置信息或位置信息

  • 别客气。我在“ Pie”中测试了此解决方案,但该解决方案仍然有效 (2认同)
  • WifiConfiguration 在 API 29 = Android 10 中已弃用 (2认同)

use*_*487 5

在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*/
Run Code Online (Sandbox Code Playgroud)


Yas*_*yan 5

这是@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)
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您不使用 BroadcastReceiver,请检查答案以使用以下方式获取 SSIDContext

这是在 Android Oreo 8.1.0 上测试的

  • 这在 9.0 上对我不起作用, getExtraInfo() 返回 null (2认同)