Android 5.0 Lollipop and 4.4 KitKat ignores my WiFi network, enableNetwork() is useless

前端 未结 3 1339
情歌与酒
情歌与酒 2020-12-24 12:49

My app connect directly to a hardware device that act as an access point (with no access to internet).

I can\'t connect because Android 5.0 automat

相关标签:
3条回答
  • 2020-12-24 13:40

    You can try to use new Lollipop API ConnectivityManager.requestNetwork(), supposedly like this:

    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) {
    
                          }
                      });
    

    where XX:XX:XX:XX:XX:XX is your WiFi SSID. I'm not sure about it's format, and if it's used at all, I did not find any references to setNetworkSpecifier inside Android sources, except for the NetworkCapabilities class.

    0 讨论(0)
  • 2020-12-24 13:40

    Just need to correctly format the SSID. Here is a sample code:

        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();
    
    0 讨论(0)
  • 2020-12-24 13:42

    I found a workaround to enable the desidered network on Lollipop:

    WifiConfiguration enable network in Lollipop

    Now this is my code after calling 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();
    }
    

    maybe the secret is the call to reconnect(), I don't know at this time.

    UPDATE Unfortunately, this workaround only works if a valid WiFi connection is active before executing the code. Does not works if you're connect by 3G only.

    UPDATE 19 Jan 2015

    This code actually works for me on 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);
                //...
            }
        });
    }
    
    0 讨论(0)
提交回复
热议问题