【问题标题】:Android 5.0 Lollipop and 4.4 KitKat ignores my WiFi network, enableNetwork() is uselessAndroid 5.0 Lollipop 和 4.4 KitKat 忽略我的 WiFi 网络,enableNetwork() 没用
【发布时间】:2015-01-14 23:02:56
【问题描述】:

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

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

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

我只是在使用:

wifiManager.enableNetwork(id, true))

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

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

【问题讨论】:

  • 我强烈建议您在 b.android.com 上提交一个错误,以获得官方对此的看法。 IMO 根据wifiManager.enableNetwork(id, true) 的文档,认为应该像以前一样继续工作。如果他们不这样做,那就是一个错误。另外,您尝试过哪些设备?
  • @curioustechizen 我在一个带有棒棒糖的nexus 5
  • @curioustechizen 正如你所说, enableNetwork() 应该继续工作,我找到了解决方案。

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


【解决方案1】:

你可以尝试使用新的 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 类。

【讨论】:

    【解决方案2】:

    我找到了在 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网络?
    • @Seraphim 的 KitKat 有什么可以连接的吗?
    • @SamvelKartashyan 在 4.4 上仍然无法为我工作。似乎很难解决,或者,也许,我很愚蠢。如果你成功了,请告诉我。
    • @Seraphim 解决了这个问题。请检查我的答案。它对我有用。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      相关资源
      最近更新 更多