【问题标题】:Unable to get WIFI SSID using onCapabilitiesChanged in Android 12无法在 Android 12 中使用 onCapabilitiesChanged 获取 WIFI SSID
【发布时间】:2021-10-10 09:30:33
【问题描述】:

说明

我无法使用 Android-12 中 ConnectivityManager.NetworkCallback 类中的 onCapabilitiesChanged 获取 WIFI SSID。 在 Android-12 中,不推荐使用 getConnectionInfo。因此,正如 android 文档所建议的那样,我正在尝试使用 onCapabilitiesChanged 获取 WifiInfo 对象。

这样,

@Override
public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
        super.onCapabilitiesChanged(network, networkCapabilities);
        WifiInfo wifiInfo = (WifiInfo) networkCapabilities.getTransportInfo();
    }

但是,当我打印 WifiInfo 对象时。它将打印 SSID: getHiddenSSID 返回 true。

意外的行为是,

Android-12 设备与一个 WIFI 连接(例如 ABC)

  • 当我尝试使用getConnectionInfo 获取 WIFI SSID 时。它返回 SSID:ABC 和 getHiddenSSID:假
  • 但是,当我尝试使用相同的网络获取 WIFI SSID 时 onCapabilitiesChanged,它返回 SSID: 和 getHiddenSSID : 真

注意:提供位置权限。

【问题讨论】:

    标签: android wifi android-wifi ssid android-12


    【解决方案1】:

    折腾了几天,终于找到onCapabilitiesChanged没有SSID的原因了。

    我们需要在创建对象时在ConnectivityManager.NetworkCallback 构造函数中传递FLAG_INCLUDE_LOCATION_INFO

    在默认构造函数中,位置敏感信息是隐藏的,因为我们无法在onCapabilitiesChanged 中获取 SSID。一旦我们创建带有标志的 NetworkCallback 对象,我们将获得 SSID。

    Link

    【讨论】:

    • 31岁之前没有,在那之前有没有替代品。
    【解决方案2】:

    获取 SSID 和 BSSID API31 Xamarin C# 示例

    所需权限:CHANGE_NETWORK_STATE、ACCESS_FINE_LOCATION

    如果 APITransportInfo 将返回 Null

    using Android.Content;
    using Android.Net;
    using Android.Net.Wifi;
    
    protected override void OnStart()
        {
            base.OnStart();
    
            NetworkRequest request = new NetworkRequest.Builder().AddTransportType(transportType: TransportType.Wifi).Build();
            ConnectivityManager connectivityManager = Android.App.Application.Context.GetSystemService(Context.ConnectivityService) as ConnectivityManager;
    
            NetworkCallbackFlags flagIncludeLocationInfo = NetworkCallbackFlags.IncludeLocationInfo;
            NetworkCallback networkCallback = new NetworkCallback((int)flagIncludeLocationInfo);
            connectivityManager.RequestNetwork(request, networkCallback);
        }
    
        private class NetworkCallback : ConnectivityManager.NetworkCallback
        {
            public NetworkCallback(int flags) : base(flags)
            {
            }
    
            public override void OnCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities)
            {
                base.OnCapabilitiesChanged(network, networkCapabilities);
                WifiInfo wifiInfo = (WifiInfo)networkCapabilities.TransportInfo;
    
                if (wifiInfo != null)
                {
                    string ssid = wifiInfo.SSID.Trim(new char[] {'"', '\"' });
                    string bssid = wifiInfo.BSSID;
                }
            }
        }
    

    点击Android API reference.ConnectivityManager.NetworkCallback(int)

    【讨论】:

      猜你喜欢
      • 2019-05-26
      • 2022-07-11
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 2018-11-30
      • 1970-01-01
      • 2021-02-05
      相关资源
      最近更新 更多