添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

9 人关注

Description

在Android-12中,我无法使用 onCapabilitiesChanged 中的 ConnectivityManager.NetworkCallback 类获得WIFI SSID。 在Android-12中,getConnectionInfo被废弃了。因此,正如android文档所建议的,我试图使用 onCapabilitiesChanged 来获取 WifiInfo 对象。

Like this,

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

But, when I print the WifiInfo object. it will print SSID: <unknown ssid>getHiddenSSID返回真。

意想不到的行为是。

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

  • When I try to get WIFI SSID using getConnectionInfo. it return SSID: ABC and getHiddenSSID : false
  • But, for the same network when I try to get WIFI SSID using onCapabilitiesChanged, it returns SSID: <unknown ssid> and getHiddenSSID : true
  • 注:提供地点许可。

    android
    wifi
    android-wifi
    ssid
    android-12
    Chirag Bhuva
    Chirag Bhuva
    发布于 2021-08-05
    3 个回答
    Chirag Bhuva
    Chirag Bhuva
    发布于 2022-08-26
    已采纳
    0 人赞同

    花了几天时间,终于找到了我在 onCapabilitiesChanged 中得不到SSID的原因。

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

    在默认构造函数中,位置敏感信息被隐藏了,因此我们无法在 onCapabilitiesChanged 中获得SSID。一旦我们创建了带有标志的 NetworkCallback 对象,我们就会得到SSID。

    它在31日之前不能使用,在那之前是否有替代方案。
    SmartHouse Coder
    SmartHouse Coder
    发布于 2022-08-26
    0 人赞同

    Get SSID and BSSID API31 Xamarin C# Example

    需要的权限。change_network_state, access_fine_location

    If API<31 运输信息 will return 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;
    

    Click Android API reference.ConnectivityManager.NetworkCallback(int)!

    user3374790
    user3374790
    发布于 2022-08-26
    0 人赞同

    Replace from new NetworkCallback() to 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