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

问题描述 投票:1回答:2

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

android android-wifi
2个回答
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");
    }
}

希望这可以帮助!


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();
© www.soinside.com 2019 - 2024. All rights reserved.