我正在为Android开发应用程序,我需要连接到特定的wifi。我设法用这段代码做到了:
// Get the current wifi's ID if any, then disable it, to make sure the device will connect to the selected wifi
int currentWifiId = mWifiManager.getConnectionInfo().getNetworkId();
mWifiManager.disconnect();
if (currentWifiId != -1) {
mWifiManager.disableNetwork(currentWifiId);
}
// After disconnecting and disabling the previously connected wifi enable and reconnect to the new one
mWifiManager.enableNetwork(config.networkId, true);
mWifiManager.reconnect();
我还使用BroadcastReceiver
方法实施了onReceive
。在onReceive
我有以下代码:
// Log
Log.i("onReceive", "called");
final String action = intent.getAction();
// If there was a state change in the network
if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if (networkInfo.getState() == State.CONNECTED) {
// Log
Log.i("onReceive", "CONNECTED to: " + mWifiManager.getConnectionInfo().getSSID());
// Check if we connected to the selected wifi
if (mWifiManager.getConnectionInfo().getSSID().equals("\"" + mAdapter.getItem(mCurrentSelectedPosition - 1) + "\"")) {
finalizeConnection();
}
}
}
当选择所需的wifi时会发生什么(并不总是),在onReceive
方法中我得到CONNECTED状态等于true,即使在我的设备上我仍然与所有wif断开连接(wifi图标没有显示在顶部栏上),然后当它真正连接到所需的wifi时,我在onReceive
方法中再次接到两个呼叫,网络状态改变,CONNECTED状态为true。
在这样的情况之后,这就是日志的样子:
05-01 10:35:55.358 6720-6720/***.***********.********** I/onReceive﹕ called
05-01 10:35:55.364 6720-6720/***.***********.********** I/onReceive﹕ CONNECTED to: "SheepWeb_CA_5Ghz"
05-01 10:35:55.398 6720-6720/***.***********.********** I/onReceive﹕ called
05-01 10:35:55.399 6720-6720/***.***********.********** I/onReceive﹕ called
05-01 10:35:55.399 6720-6720/***.***********.********** I/onReceive﹕ called
05-01 10:35:55.417 6720-6720/***.***********.********** I/onReceive﹕ called
05-01 10:35:55.417 6720-6720/***.***********.********** I/onReceive﹕ called
05-01 10:35:58.115 6720-6720/***.***********.********** I/onReceive﹕ called
05-01 10:35:58.118 6720-6720/***.***********.********** I/onReceive﹕ called
05-01 10:35:58.124 6720-6720/***.***********.********** I/onReceive﹕ called
05-01 10:35:58.128 6720-6720/***.***********.********** I/onReceive﹕ called
05-01 10:35:58.132 6720-6720/***.***********.********** I/onReceive﹕ called
05-01 10:35:58.140 6720-6720/***.***********.********** I/onReceive﹕ called
05-01 10:35:58.875 6720-6720/***.***********.********** I/onReceive﹕ called
05-01 10:35:58.889 6720-6720/***.***********.********** I/onReceive﹕ called
05-01 10:35:58.894 6720-6720/***.***********.********** I/onReceive﹕ called
05-01 10:35:58.896 6720-6720/***.***********.********** I/onReceive﹕ CONNECTED to: "SheepWeb_CA_5Ghz"
05-01 10:35:58.951 6720-6720/***.***********.********** I/onReceive﹕ called
05-01 10:35:58.955 6720-6720/***.***********.********** I/onReceive﹕ CONNECTED to: "SheepWeb_CA_5Ghz"
05-01 10:36:22.400 6720-6720/***.***********.********** I/onReceive﹕ called
这是为什么?我只想在我真正连接到所需的wifi时调用finalizeConnection()
方法。请注意,这个wifi可能没有互联网连接(在我的情况下这不是问题)。
答案 0 :(得分:0)
我有类似的问题。这就是我解决它的方法。
在接收中:
if(WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action))
{
NetworkInfo netInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
Log.d(TAG,"Network state changed action" + netInfo.getDetailedState().name());
if(netInfo.getDetailedState().equals(NetworkInfo.DetailedState.CONNECTED))
{
Log.i("onReceive", "Connected");
}
}
希望这有帮助!
答案 1 :(得分:0)
我在此遇到了类似的问题
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Network[] networks = connectivityManager.getAllNetworks();
NetworkInfo networkInfo;
for (Network mNetwork: networks) {
networkInfo = connectivityManager.getNetworkInfo(mNetwork);
if (networkInfo.getState().equals(NetworkInfo.State.CONNECTED)) {
return true;
}
}
}
我已更改
return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected();