Android 5.0 Lollipop和4.4 KitKat忽略了我的WiFi网络,enableNetwork()没用

时间:2014-11-17 21:59:09

标签: android android-wifi android-5.0-lollipop connectivity

我的应用直接连接到充当接入点的硬件设备(无法访问互联网)。

我无法连接因为Android 5.0自动切换到有效的互联网连接,所以如果我有数据连接(3G,4G,...)或预先配置的网络,我无法连接到我的设备,因为它忽略了WiFi。

那么我如何强制Android使用我以编程方式激活的网络?

我只是在使用:

wifiManager.enableNetwork(id, true))

其中id是我要连接的设备的网络。 true参数无用。

使用ConnectivityManager.requestNetwork()的建议解决方案无效。

3 个答案:

答案 0 :(得分:8)

您可以尝试使用新的Lollipop API ConnectivityManager.requestNetwork(),如下所示:

ConnectivityManager cm = (ConnectivityManager) Context.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.requestNetwork(new NetworkRequest.Builder()
                  .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                  .setNetworkSpecifier("XX:XX:XX:XX:XX:XX")
                  .build(),
                  new ConnectivityManager.NetworkCallback() {
                      void onAvailable(Network network) {

                      }
                  });

其中XX:XX:XX:XX:XX:XX是您的WiFi SSID。我不确定它的格式,如果它完全被使用,我在Android源代码中找不到setNetworkSpecifier的任何引用,除了NetworkCapabilities类。

答案 1 :(得分:7)

我找到了一种解决方法,可以在Lollipop上启用所需的网络:

WifiConfiguration enable network in Lollipop

现在这是我调用wifiManager.enableNetwork(id, true)后的代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    List<WifiConfiguration> networks = wm.getConfiguredNetworks();
    Iterator<WifiConfiguration> iterator = networks.iterator();
    while (iterator.hasNext()) {
        WifiConfiguration wifiConfig = iterator.next();
        if (wifiConfig.SSID.replace("\"", "").equals(wc.SSID.replace("\"", "")))
            wm.enableNetwork(wifiConfig.networkId, true);
        else
            wm.disableNetwork(wifiConfig.networkId);
    }
    wm.reconnect();
}

也许秘密就是致电reconnect(),我此时此刻不知道。

<强>更新 遗憾的是,只有在执行代码之前有效的WiFi连接处于活动状态时,此解决方法才有效。如果您仅通过3G连接,则无效。

2015年1月19日更新

此代码在Android 5 / 6.0.x上实际适用于我:

//bind to current thread
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkRequest.Builder request = new NetworkRequest.Builder();
    request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
    connManager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            ConnectivityManager.setProcessDefaultNetwork(network);
            //...
        }
    });
}

答案 2 :(得分:0)

只需要正确格式化SSID即可。以下是示例代码:

    WifiManager mWifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE);
    WifiConfiguration tmpConfig = new WifiConfiguration();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        tmpConfig.SSID = String.format("\"%s\"", sSSID);
        tmpConfig.BSSID = sBSSID;
    } else {
        tmpConfig.SSID = "\"" + sSSID + "\"";
        tmpConfig.BSSID = "\"" + sBSSID + "\"";
    }

    tmpConfig.priority = 1;
    if (iSecurityType.equals("WEP")) {
        tmpConfig.wepKeys[0] = sPassword;
        tmpConfig.wepTxKeyIndex = 0;
    } else if (iSecurityType.equals("WPA2") ||   iSecurityType.equals("WPA")) {
            tmpConfig.preSharedKey = "\"" + sPassword+ "\"";
        } else {
            tmpConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
        }

    tmpConfig.status = WifiConfiguration.Status.ENABLED;
    int netId = mWifiManager.addNetwork(tmpConfig);

    mWifiManager.updateNetwork(tmpConfig);
    boolean result = mWifiManager.enableNetwork(netId, true);
    mWifiManager.updateNetwork(tmpConfig);
    mWifiManager.saveConfiguration();