2017-02-27 1 views
0

Ich versuche, benachrichtigt zu werden, wenn mein Telefon mit einem neuen Wifi-Netzwerk verbunden wird.Broadcast Receiver wird benachrichtigt, wenn eine Verbindung zu einem anderen WLAN-Netzwerk hergestellt wird

Das ist mein BroadcastReceiver ‚s Logik:

@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { 
     Bundle extras = intent.getExtras(); 
     if (extras != null) { 
      for (String key : extras.keySet()) { 
       if(key.equals("networkInfo")){ 
        NetworkInfo info = (NetworkInfo) extras.get(key); 
        if(info.getType() == ConnectivityManager.TYPE_WIFI){ 
         if(info.getState().toString().equals("CONNECTED")){ 
          //do stuff 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Das funktioniert gut, wenn ich auf meinem Wifi drehen und zu einem neuen Netzwerk verbinden. Aber mein Problem ist, dass nichts passiert, wenn ich bereits mit einem Wifi-Netzwerk verbunden bin und mich dann mit einem anderen verbinde.

Was ist das richtige Actoin, das ich zu meinem IntentFilter hinzufügen sollte, um das zu erreichen?

EDIT

Dieser Code funktioniert gut. Das Problem war, dass die WifiReceiver nicht registriert wurde.

Antwort

1

Bitte versuchen Sie diese Lösung,

BroadcastReceiver broadcastReceiver = new WifiBroadcastReceiver(); 

IntentFilter intentFilter = new IntentFilter(); 
intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 
context.registerReceiver(broadcastReceiver, intentFilter); 

Sie müssen die MAC-Adressen der Router zu überprüfen zu überprüfen, ob es eine Änderung in der Wireless-LAN-Verbindung.

public class WifiBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION .equals(action)) { 
      SupplicantState state = intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE); 
      if (SupplicantState.isValidState(state) 
        && state == SupplicantState.COMPLETED) { 
       boolean changed = checkWifiChanged(); 
      } 
     } 
    } 

    /** Detect if WiFi is changed. */ 
    private boolean checkWifiChanged() { 
     boolean changed = false; 

     // You can store the previous MAC address in Shared Preferences and fetch it here 
     String previousMacAddress = getPreviousMacAddress(); 

     WifiManager wifiManager = 
      (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 

     WifiInfo wifi = wifiManager.getConnectionInfo(); 
     if (wifi != null) { 
      // Get current router MAC address 
      String bssid = wifi.getBSSID(); 
      changed = !previousMacAddress.equals(bssid); 
     } 

     return changed; 
    } 
} 

Sie können speichern die vorherige MAC-Adresse in einer Datenbank oder Shared Preference und überprüfen Sie die neue angeschlossenen MAC-Adresse mit der vorherigen. Wenn sie unterschiedlich sind, hat sich die WLAN-Verbindung sonst nicht geändert.

+0

Es hat nicht funktioniert. Der 'WifiManager.SUPPLICANT_STATE_CHANGED_ACTION' funktioniert nur, wenn ich meinen Wifi einschalte und mich mit einem Wifi-Netzwerk verbinde. Aber wenn ich von einem Wifi-Netzwerk zu einem anderen wechsle, tut es nichts. – kamal

+0

Sorry, ich habe einen Fehler gemacht. Ich habe die Anwendung beendet, die 'onPause() 'aufruft und somit den' WifiReceiver 'abmeldet. Dein Code funktioniert einwandfrei. – kamal

+0

In diesem Fall können Sie die Übertragung in Ihrer Manifestdatei registrieren. Wenn die Antwort Ihnen hilft, überlegen Sie bitte, die Antwort zu verbessern. –

Verwandte Themen