SUPPLICANT_CONNECTION_CHANGE_ACTION 从未收到
SUPPLICANT_CONNECTION_CHANGE_ACTION never received
我希望在设备切换网络时收到通知,但由于某些奇怪的原因,尽管有文档和各种 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"/>
很想知道我忽略了什么。
我遇到了类似的问题并设法解决了它。
我正在使用 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));
注意:我没有设置任何额外的权限。
我希望在设备切换网络时收到通知,但由于某些奇怪的原因,尽管有文档和各种 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"/>
很想知道我忽略了什么。
我遇到了类似的问题并设法解决了它。
我正在使用 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));
注意:我没有设置任何额外的权限。