2017-02-27 54 views
0

我試圖在手機連接到新的Wifi網絡時收到通知。當連接到另一個WiFi網絡時,廣播接收器會得到通知

這是我BroadcastReceiver的邏輯:

@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 
         } 
        } 
       } 
      } 
     } 
    } 
} 

,當我打開我的無線網絡連接,連接到一個新的網絡能正常工作。但我的問題是,當我已經連接到Wifi網絡,然後連接到另一個然後沒有任何反應。

什麼是正確的Actoin,我應該添加到我的IntentFilter爲了實現這一目標?

編輯

此代碼工作正常。問題在於WifiReceiver未註冊。

回答

1

請嘗試此解決方案,

BroadcastReceiver broadcastReceiver = new WifiBroadcastReceiver(); 

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

你需要檢查路由器的MAC地址,以檢查是否存在WiFi連接的變化。

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; 
    } 
} 

您可以存儲先前的MAC地址在數據庫或共享偏好和與前一個檢查新連接的MAC地址。如果它們不同,那麼WiFi連接已經改變,否則不是。

+0

它沒有工作。 WifiManager.SUPPLICANT_STATE_CHANGED_ACTION只在打開我的Wifi並連接到Wifi網絡時才起作用。但是當我從一個Wifi網絡移動到另一個時,它什麼都不做。 – kamal

+0

對不起,我犯了一個錯誤。我正在退出調用'onPause()'的應用程序,因此取消註冊'WifiReceiver'。你的代碼工作正常。 – kamal

+0

在這種情況下,您可以在清單文件中註冊廣播。如果答案對您有幫助,請考慮提供答案。 –

相關問題