Unable to get WIFI SSID using onCapabilitiesChanged in Android 12

Viewed 2123

Description

I am unable to get WIFI SSID using the onCapabilitiesChanged in the ConnectivityManager.NetworkCallback class in Android-12. In Android-12, getConnectionInfo is deprecated. So, as the android document suggests I am trying to get the WifiInfo object using onCapabilitiesChanged.

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> and getHiddenSSID return true.

Unexpected behavior is,

Android-12 device is connected with one WIFI (Ex. 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

Note: Location permission is provided.

3 Answers

After spending few days, finally found why I am not getting SSID in onCapabilitiesChanged.

We need to pass FLAG_INCLUDE_LOCATION_INFO in the ConnectivityManager.NetworkCallback constructor while creating an object.

in the default constructor, location sensitive information is hidden due to that we are not able to get SSID in onCapabilitiesChanged. Once we create NetworkCallback object with a flag we will get SSID.

Link

Get SSID and BSSID API31 Xamarin C# Example

Required permissions: CHANGE_NETWORK_STATE, ACCESS_FINE_LOCATION

If API<31 TransportInfo 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)!

Replace from new NetworkCallback() to new NetworkCallback(ConnectivityManager.NetworkCallback.FLAG_INCLUDE_LOCATION_INFO).

Example Code:

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

Reference Link:

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

Related