SUPPLICANT_CONNECTION_CHANGE_ACTION never received

允我心安 提交于 2019-12-10 14:09:51

问题


I am looking to be notified when the device switches networks but for some oddball reason, in spite of the documentation and various examples on SO, this particular action never gets sent to my receiver.

Here's my code

RECEIVER:

BroadcastReceiver connectedToLocalWifiReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();
            Log.d(TAG, "ACTION='" + action +"'"); //<-- WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION never turns up here
            if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
                if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)){
                    //this block of code is never called

                } else {
                    // ditto for this block
                }
            }
        }
    };

REGISTERING: In my code right before I go to connect to the network I register my receiver. I have tried registering it with other actions and they do turn up (like ConnectivityManager.CONNECTIVITY_ACTION for instance) but for SUPPLICANT_CONNECTION_CHANGE_ACTION I get nothing.

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
registerReceiver(connectedToLocalWifiReceiver, intentFilter);
wifiManager.enableNetwork(i.networkId, true);
wifiManager.reconnect();

So at this point the wifi does in fact disconnect from its current network and connect to the one I'm specifying, but it does so without ever broadcasting anything.

I can't see anything obviously wrong, but must be missing something pretty fundamental.

My manifest permissions are set thusly, though I don't see how, given that it actually does the wifi switching correctly, permissions could have anything to do with it anymore:

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>

Would love to find out what I'm overlooking.


回答1:


I stuck with a similar problem and managed to solve it.

I'm using NETWORK_STATE_CHANGED_ACTION instead of SUPPLICANT_CONNECTION_CHANGE_ACTION.

registerReceiver(new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        Log.v(LOG_TAG, "onReceive");
        if (intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
            Log.d(LOG_TAG, "network state was changed");
            NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
            if (networkInfo.getState() == NetworkInfo.State.CONNECTED) {
                Log.d(LOG_TAG, "network connection has been established");
                // the receiver is no longer needed, so unregist it immediately.
                unregisterReceiver(this);

                // do something...

            }
        }
    }
}, new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION));

Note: I don't set any additional permissions.



来源:https://stackoverflow.com/questions/34803067/supplicant-connection-change-action-never-received

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!