10

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.

Chirag Bhuva
  • 851
  • 7
  • 14

4 Answers4

9

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

Chirag Bhuva
  • 851
  • 7
  • 14
1

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)!

0

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)

user3374790
  • 227
  • 3
  • 13
0

this method work for me in all android versions, but For Android 8.0 (Oreo) and later versions, you need to have location services (GPS) turned on to access the Wi-Fi SSID. Also, you need to request the ACCESS_COARSE_LOCATION and ACCESS_FINE_LOCATION permissions at runtime and declare them in the manifest file. If you want to access the Wi-Fi SSID in the background, you can write a foreground service to handle that.

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)

}