当设备显示没有连接时,为什么Android networkInfo状态CONNECTED为true

时间:2015-05-01 15:09:19

标签: android android-wifi

我正在为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可能没有互联网连接(在我的情况下这不是问题)。

2 个答案:

答案 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();