I have the following BroadcastRecevier:
public class WiFiConnectionEventsReceiver extends BroadcastReceiver { private static final String TAG = WiFiConnectionEventsReceiver.class.getSimpleName(); @Override public void onReceive(Context context, @NonNull Intent intent) { Log.v(TAG, "action: " + intent.getAction()); Log.v(TAG, "component: " + intent.getComponent()); Bundle extras = intent.getExtras(); if (extras != null) { for (String key : extras.keySet()) { Log.v(TAG, "key [" + key + "]: " + extras.get(key)); } } else { Log.v(TAG, "no extras"); } ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = conMan.getActiveNetworkInfo(); if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI) { Log.d("NetworkInfo", "Have Wifi Connection"); Log.d("NetworkInfo", netInfo.getExtraInfo()); Log.d("NetworkInfo", netInfo.getTypeName()); } else { Log.d("NetworkInfo", "Don't have Wifi Connection"); Log.d("NetworkInfo", netInfo.getExtraInfo()); Log.d("NetworkInfo", netInfo.getTypeName()); } WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); Log.d("WifiInfo", wifiManager.getConnectionInfo().toString()); } }
It receives network connection and disconnect events.
When it connects to the WiFi network, I can easily get the SSID of the network.
But I want to get the SSID of the WiFi network when the network is disconnected (without having to store previously connected networks, and then map them that way, etc.). Is it possible?
Logs when connecting WiFi:
V/WiFiConnectionEventsReceiver: action: android.net.conn.CONNECTIVITY_CHANGE V/WiFiConnectionEventsReceiver: component: ComponentInfo{com.example.test/com.example.test.WiFiConnectionEventsReceiver} V/WiFiConnectionEventsReceiver: key [networkInfo]: [type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: "SKY123", roaming: false, failover: false, isAvailable: true] V/WiFiConnectionEventsReceiver: key [networkType]: 1 V/WiFiConnectionEventsReceiver: key [inetCondition]: 100 V/WiFiConnectionEventsReceiver: key [extraInfo]: "SKY123" D/NetworkInfo: Have Wifi Connection D/NetworkInfo: "SKY123" D/NetworkInfo: WIFI D/WifiInfo: SSID: SKY123, BSSID: 10:40:03:ad:6x:c9, MAC: 02:00:00:00:00:00, Supplicant state: COMPLETED, RSSI: -79, Link speed: 43Mbps, Frequency: 2412MHz, Net ID: 1, Metered hint: false, score: 60
Logs when WiFi is disconnected (note the unknown SSID):
V/WiFiConnectionEventsReceiver: action: android.net.conn.CONNECTIVITY_CHANGE V/WiFiConnectionEventsReceiver: component: ComponentInfo{com.example.test/com.example.test.WiFiConnectionEventsReceiver} V/WiFiConnectionEventsReceiver: key [networkInfo]: [type: WIFI[], state: DISCONNECTED/DISCONNECTED, reason: (unspecified), extra: <unknown ssid>, roaming: false, failover: false, isAvailable: true] V/WiFiConnectionEventsReceiver: key [networkType]: 1 V/WiFiConnectionEventsReceiver: key [inetCondition]: 0 V/WiFiConnectionEventsReceiver: key [extraInfo]: <unknown ssid> V/WiFiConnectionEventsReceiver: key [noConnectivity]: true D/NetworkInfo: Don't have Wifi Connection D/NetworkInfo: id D/NetworkInfo: MOBILE D/WifiInfo: SSID: <unknown ssid>, BSSID: <none>, MAC: 02:00:00:00:00:00, Supplicant state: COMPLETED, RSSI: -127, Link speed: -1Mbps, Frequency: -1MHz, Net ID: -1, Metered hint: false, score: 0
The reason I need this information is because I want to track the user's Wi-Fi usage on each network - connection and disconnect times.
Without the SSID of the disconnected network, the only way I can do this is with something like:
if (WiFi network ABC disconnected) if (if previous stored connection for WiFi network ABC has no disconnection time) set WiFI network ABC disconnection time to now
However, the above approach seems flaky, for example, that if for some reason the Wi-Fi disconnect event is skipped, etc.