连接到特定的wifi有时会在Android上失败

Sil*_*lex 9 android android-wifi

我正在创建一个应用程序,它可以列出ListView中所有可用的wifi.如果我选择列表中的一个wifi,它之前被缓存,List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();那么它应该连接到它.如果WifiConfiguration列表不包含所选的wifi,则没有任何反应.我的问题是,有时我从列表中选择一个wifi(我肯定知道它在WifiConfiguration列表中),但它没有连接到它.相反,它连接回以前连接的WiFi.经过一些尝试(一次又一次地选择相同的wifi),它最终连接到它.这有时不会发生.可能是什么问题?这是我的代码片段:

// Go through all the cached wifis and check if the selected GoPro was cached before
for (WifiConfiguration config : configurations) {
    // If it was cached connect to it and that's all
    if (config.SSID != null && config.SSID.equals("\"" + mDrawerListView.getAdapter().getItem(position) + "\"")) {
        // Log
        Log.i("onReceive", "Connecting to: " + config.SSID);
        mWifiManager.disconnect();
        mWifiManager.enableNetwork(config.networkId, true);
        mWifiManager.reconnect();
        break;
     }
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*ent 10

这是正在发生的事情.基本上,您可以告诉操作系统禁用网络,并且您可以告诉操作系统启用网络,但是无法告诉操作系统要连接到哪个网络.

如果在设备上配置了多个WiFi接入点(并且两者都处于enabled状态),则操作系统将决定连接哪个接入点.

强制操作系统连接到范围中的一个网络而不是另一个网络的唯一方法是调用disableNetwork()您不想连接的范围内的网络.

让我们逐行完成您的代码:

mWifiManager.disconnect();
Run Code Online (Sandbox Code Playgroud)

上面的行告诉操作系统断开与当前连接的WiFi接入点的连接.

mWifiManager.enableNetwork(config.networkId, true);
Run Code Online (Sandbox Code Playgroud)

上面的行告诉设备将网络设置enabled为先前处于该disabled状态的状态.

mWifiManager.reconnect(); 
Run Code Online (Sandbox Code Playgroud)

文档:

如果我们当前已断开连接,请重新连接到当前活动的接入点.这可能导致状态更改事件的异步传递.

所以,当你说相反它连接回以前连接的wifi.,它正如预期的那样工作,因为操作系统正在重新连接到它认为当前活动的接入点.

如果你真的想要禁用其他网络,以便操作系统连接到你刚刚点击的那个,你可以这样做:

// Go through all the cached wifis and check if the selected GoPro was cached before

WifiInfo info = mWifiManager.getConnectionInfo(); //get WifiInfo
int id = info.getNetworkId(); //get id of currently connected network

for (WifiConfiguration config : configurations) {
    // If it was cached connect to it and that's all
    if (config.SSID != null && config.SSID.equals("\"" + mDrawerListView.getAdapter().getItem(position) + "\"")) {
        // Log
        Log.i("onReceive", "Connecting to: " + config.SSID);

        mWifiManager.disconnect();

        mWifiManager.disableNetwork(id); //disable current network

        mWifiManager.enableNetwork(config.networkId, true);
        mWifiManager.reconnect();
        break;
     }
}
Run Code Online (Sandbox Code Playgroud)