【问题标题】:SUPPLICANT_CONNECTION_CHANGE_ACTION never receivedSUPPLICANT_CONNECTION_CHANGE_ACTION 从未收到
【发布时间】:2016-01-15 01:46:11
【问题描述】:

我希望在设备切换网络时收到通知,但出于某种奇怪的原因,尽管有关于 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
                }
            }
        }
    };

注册: 在我连接到网络之前的代码中,我注册了我的接收器。我试过用其他动作注册它,它们确实出现了(例如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 实际上确实断开了与当前网络的连接并连接到我指定的网络,但它在没有广播任何内容的情况下这样做。

我看不出有什么明显的错误,但肯定是遗漏了一些非常基本的东西。

我的清单权限是这样设置的,虽然我不知道如何,鉴于它实际上正确地进行了 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"/>

很想知道我忽略了什么。

【问题讨论】:

    标签: android android-wifi android-broadcastreceiver


    【解决方案1】:

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

    我使用的是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));
    

    注意:我没有设置任何额外的权限。

    【讨论】:

      猜你喜欢
      • 2021-06-17
      • 2015-07-09
      • 2021-04-18
      • 2018-11-02
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多