安卓5.0棒棒糖和4.4奇巧无法识别我的WiFi网络,enableNetwork()无效。

25

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

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

那么,如何强制Android使用我通过程序激活的网络?

我只是简单地使用:

wifiManager.enableNetwork(id, true))

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

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


3
我建议你在b.android.com上提交一个bug,以获得官方的意见。根据wifiManager.enableNetwork(id, true)的文档,我认为事情应该像之前一样继续工作。如果不行,则这是一个漏洞。另外,你试过哪些设备? - curioustechizen
@curioustechizen 我使用运行Lollipop的Nexus 5。 - Seraphim's
@curioustechizen 正如你所说,enableNetwork() 应该继续工作,我找到了一个解决方案。 - Seraphim's
3个回答

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类。


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);
            //...
        }
    });
}

那么这意味着在KitKat上目前没有办法连接到特定的WiFi网络? - granko87
@Seraphim,有什么方法可以在 KitKat 上连接吗? - Samvel Kartashyan
@SamvelKartashyan 在4.4上对我仍然不起作用。似乎很棘手,或者可能是我太蠢了。如果你成功了,请告诉我。 - Seraphim's
@Seraphim已经解决了那个问题。请检查我的答案,它对我有效。 - Samvel Kartashyan

1

只需正确格式化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();

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