我希望在设备切换网络时收到通知,但出于某种奇怪的原因,尽管有SO上的文档和各种示例,但此特定操作从未发送到我的接收器。

这是我的代码

接收者:

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

注册:
在连接网络之前,用我的代码注册接收器。我试着用其他 Action 注册它,但它们确实出现了(例如像ConnectivityManager.CONNECTIVITY_ACTION),但是对于SUPPLICANT_CONNECTION_CHANGE_ACTION我什么也没得到。
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
registerReceiver(connectedToLocalWifiReceiver, intentFilter);
wifiManager.enableNetwork(i.networkId, true);
wifiManager.reconnect();

因此,在这一点上,wifi实际上确实断开了其当前网络的连接并连接到我指定的网络,但是这样做却从未广播任何内容。

我看不到任何明显错误的东西,但是必须缺少一些基本的东西。

这样,我的 list 权限就被设置了,尽管我不知道如何设置,因为它实际上可以正确切换wifi,所以权限可能与它有任何关系:
<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"/>

很想找出我所忽略的东西。

最佳答案

我遇到了类似的问题,并设法解决了这个问题。

我正在使用NETWORK_STATE_CHANGED_ACTION而不是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));

注意:我没有设置任何其他权限。

10-07 23:14