Android网络无法在Wifi断开后重新连接

3

为什么在安卓(棒棒糖版本)上设置的Wifi网络在路由器重置后不会自动重新连接?网络是这样设置的:

private boolean connectToNetwork(ScanResult scanResult, String password, WifiManager wifiManager)
{
    WifiConfiguration wifiConfig = new WifiConfiguration();
    String quotedSSID = "\"" + scanResult.SSID + "\"";
    wifiConfig.SSID = quotedSSID;
    wifiConfig.status = WifiConfiguration.Status.DISABLED;
    wifiConfig.priority = 40;

    // Dependent on the security type of the selected network
    // we set the security settings for the configuration
    SecurityType securityType = getSecurityType(scanResult);
    if (securityType == SecurityType.Open)
    {
        // No security
        wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
        wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
        wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
        wifiConfig.allowedAuthAlgorithms.clear();
        wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
        wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
        wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
        wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
        wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
        wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    }
    else if (securityType == SecurityType.WPA)
    {
        //WPA/WPA2 Security
        wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
        wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
        wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
        wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
        wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
        wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
        wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
        wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
        wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
        wifiConfig.preSharedKey = "\"".concat(password).concat("\"");
    }
    else if (securityType == SecurityType.WEP)
    {
        // WEP Security
        wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
        wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
        wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
        wifiConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
        wifiConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
        wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
        wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
        wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
        wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);

        if (getHexKey(password))
            wifiConfig.wepKeys[0] = password;
        else
            wifiConfig.wepKeys[0] = "\"".concat(password).concat("\"");
        wifiConfig.wepTxKeyIndex = 0;
    }

    // Finally we add the new configuration to the managed list of networks
    connectionReceiver = new ConnectionReceiver();
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
    intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
    registerReceiver(connectionReceiver, intentFilter);
    int networkID = wifiManager.addNetwork(wifiConfig);
    if (networkID != -1)
    {
        if(wifiManager.enableNetwork(networkID, true))
        {
            wifiManager.saveConfiguration();
            return true;
        }
    }

    // Connection failed
    unregisterReceiver(connectionReceiver);
    connectionReceiver = null;

    return false;
}

这段代码可以正常工作并连接到网络。在关闭Wifi路由器之前,网络将继续正常工作。然后,在重新打开它并等待设备重新连接后,我会遇到错误,并且无法访问互联网。以下代码返回true,因此看起来设备已重新连接到网络:

public boolean isNetworkAvailable()
{
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

以上活动网络是正确的Wifi网络,但在尝试访问任何内容时,我会遇到错误。例如,Chromium会给出一堆:

E/chromium: [ERROR:socket_posix.cc(80)] CreatePlatformSocket() returned an error, errno=64: Machine is not on the network
W/chromium: [WARNING:net_errors_posix.cc(116)] Unknown error 64 mapped to net::ERR_FAILED

并且Volley提供了相同的功能:
java.net.SocketException: socket failed: errno 64 (Machine is not on the network)
1个回答

4
原来代码将进程默认网络设置到了其他地方: connectivityManager.setProcessDefaultNetwork(net); 删除这行代码解决了问题。

你可以绝对使用上述代码行。当状态变为断开连接时,你需要使用广播管理器从网络解除绑定,使用 connMgr.setProcessDefaultNetwork(null);。感谢这篇文章:https://dev59.com/IFkS5IYBdhLWcg3wCSdx - Pierre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接