【问题标题】:Broadcast Receiver get notified when connecting to another wifi network连接到另一个 wifi 网络时,广播接收器会收到通知
【发布时间】:2017-07-17 12:11:32
【问题描述】:

我正在尝试在我的手机连接到新的 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 并连接到新网络时,这可以正常工作。但我的问题是,当我已经连接到 Wifi 网络然后再连接到另一个网络时,什么也没有发生。

为了实现这一点,我应该添加到我的IntentFilter 中的正确Actoin 是什么?

编辑

此代码运行良好。问题是 WifiReceiver 被取消注册。

【问题讨论】:

    标签: android networking


    【解决方案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 地址与之前的 MAC 地址进行核对。如果它们不同,则 WiFi 连接已更改,否则不会。

    【讨论】:

    • 它没有用。 WifiManager.SUPPLICANT_STATE_CHANGED_ACTION 仅在我打开 Wifi 并连接到 Wifi 网络时工作。但是当我从一个 Wifi 网络移动到另一个网络时,它什么也没做。
    • 对不起,我弄错了。我正在退出调用onPause() 并因此注销WifiReceiver 的应用程序。您的代码运行良好。
    • 在这种情况下,您可以在清单文件中注册广播。如果答案对您有帮助,请考虑为答案投票。
    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多