在安卓12中使用onCapabilitiesChanged无法获取WIFI的SSID

11

描述

在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: <unknown ssid>getHiddenSSID返回true。

意外的行为是:

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

  • 当我尝试使用getConnectionInfo获取WIFI SSID时,它返回SSID:ABC和getHiddenSSID:false
  • 但是,对于相同的网络,当我尝试使用onCapabilitiesChanged获取WIFI SSID时,它返回SSID:<unknown ssid> 和getHiddenSSID:true

注意:已提供位置权限。

4个回答

11

经过几天的努力,最终找到了为什么我在onCapabilitiesChanged中没有得到SSID。

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

在默认构造函数中,由于隐藏了位置敏感信息,因此我们无法在onCapabilitiesChanged中获取SSID。一旦我们使用标志创建NetworkCallback对象,我们将获得SSID。

链接


4
31号之前不可用,有没有在那之前的替代选择? - Yuri Schimke
1
@YuriSchimke 在 31 号之前,你不需要使用 onCapabilitiesChanged 来获取 SSID。即使它已经被弃用了,你仍然可以使用 WifiManager - Wachid Susilo

1

获取SSID和BSSID API31 Xamarin C#示例

所需权限:CHANGE_NETWORK_STATE,ACCESS_FINE_LOCATION

如果API<31,则TransportInfo将返回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参考.ConnectivityManager.NetworkCallback(int)


0

new NetworkCallback()替换为new NetworkCallback(ConnectivityManager.NetworkCallback.FLAG_INCLUDE_LOCATION_INFO)

示例代码:

final NetworkRequest request =
      new NetworkRequest.Builder()
      .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
      .build();
 final ConnectivityManager connectivityManager =
      context.getSystemService(ConnectivityManager.class);
 final NetworkCallback networkCallback = new NetworkCallback(ConnectivityManager.NetworkCallback.FLAG_INCLUDE_LOCATION_INFO) {
      ...
      @Override
      void onAvailable(Network network) {}

      @Override
      void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
          WifiInfo wifiInfo = (WifiInfo) networkCapabilities.getTransportInfo();
      }
      // etc.
 };
 connectivityManager.requestNetwork(request, networkCallback); // For request
 connectivityManager.registerNetworkCallback(request, networkCallback); // For listen

参考链接:

https://developer.android.com/reference/android/net/wifi/WifiManager#getConnectionInfo() https://developer.android.com/reference/android/net/ConnectivityManager.NetworkCallback#NetworkCallback(int)


0

这个方法在所有的安卓版本中都适用,但是对于安卓8.0(奥利奥)及以上版本,你需要开启位置服务(GPS)才能访问Wi-Fi SSID。此外,你需要在运行时请求ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION权限,并在清单文件中声明它们。 如果你想在后台访问Wi-Fi SSID,可以编写一个前台服务来处理。

private fun checkWIFIName(context: Context) : Boolean {
    val wifiManager = context.applicationContext.getSystemService(WIFI_SERVICE) as WifiManager
    val wifiInfo = wifiManager.connectionInfo
    println("SSID : ${wifiInfo.ssid}")
    return wifiInfo.ssid.trim().equals("\"$SSID\"", true)

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接