Android 6 : Connect to specific wifi network progr

2019-03-30 19:16发布

问题:

I am trying to connect to a wifi network by giving the SSID and pass using WifiManager configurations.

Based on this threads solution: How do I connect to a specific Wi-Fi network in Android programmatically?

The reconnect method is called. but nothing happens (not connected).

Is the Android version (6.0.1) for something? If yes then how to perform a network connection programmatically on Android 6?

回答1:

A few things have changed about how you connect to a WiFi network since android Marshmallow. The following code will help you...If you are using Android 6.0 or lowlevel versions...

public void connectToWifi(){
    try{
        WifiManager wifiManager = (WifiManager) super.getSystemService(android.content.Context.WIFI_SERVICE);
        WifiConfiguration wc = new WifiConfiguration();
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        wc.SSID = "\"NETWORK_NAME\"";
        wc.preSharedKey = "\"PASSWORD\"";
        wc.status = WifiConfiguration.Status.ENABLED;
        wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
        wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);

        wifiManager.setWifiEnabled(true);
        int netId = wifiManager.addNetwork(wc);
        if (netId == -1) {
            netId = getExistingNetworkId(wc.SSID);
        }
        wifiManager.disconnect();
        wifiManager.enableNetwork(netId, true);
        wifiManager.reconnect();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
private int getExistingNetworkId(String SSID) {
    WifiManager wifiManager = (WifiManager) super.getSystemService(Context.WIFI_SERVICE);
    List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks();
    if (configuredNetworks != null) {
        for (WifiConfiguration existingConfig : configuredNetworks) {
            if (existingConfig.SSID.equals(SSID)) {
                return existingConfig.networkId;
            }
        }
    }
    return -1;
}

And add permissions in the Manifest file

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />


回答2:

Add a wifi configuration using addNetwork and then connect to it using enableNetwork.

    WifiConfiguration wificonfiguration = new WifiConfiguration();
    StringBuffer stringbuffer = new StringBuffer("\"");
    stringbuffer.append((new StringBuilder(String.valueOf(HOTSPOT_NAME))).append("\"").toString());
    wificonfiguration.SSID = stringbuffer.toString();
    wificonfiguration.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
    wificonfiguration.allowedAuthAlgorithms.set(0);
    wificonfiguration.status = 2;
    wificonfiguration.preSharedKey = "\"" + HOTSPOT_PASSWORD + "\"";

    int networkId_ = wifi.addNetwork(wificonfiguration);

    if(networkId>-1){

           boolean status = wifi.enableNetwork(networkId_, true);

    }

For marshmallow: Your apps can now change the state of WifiConfiguration objects only if you created these objects. You are not permitted to modify or delete WifiConfiguration objects created by the user or by other apps. More info on Marshmallow



回答3:

You need to call disconnect() and reconnect() of WiFiManager. This works for me:

                WifiConfiguration conf = new WifiConfiguration();
                conf.hiddenSSID = true;
                conf.priority = 1000;
                conf.SSID = "\"" + SSID + "\"";
                conf.preSharedKey = "\""+Password+"\"";
                conf.status = WifiConfiguration.Status.ENABLED;
                conf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);

                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);

                conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
                conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);

                conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
                conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);

                conf.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
                conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
                int res = wifiManager.addNetwork(conf);
                boolean es = wifiManager.saveConfiguration();
                Log.d(TAG, "saveConfiguration returned " + es );
                wifiManager.disconnect();
                boolean bRet = wifiManager.enableNetwork(res, true);
                Log.i(TAG, "enableNetwork bRet = " + bRet);
                wifiManager.reconnect();


回答4:

A few things have changed about how you connect to a WiFi network since android Lollipop and Marshmallow. There is a nice blog post related to how you connect to WiFi network on Marshmallow and below versions

http://www.intentfilter.com/2016/08/programatically-connecting-to-wifi.html

The post describes a scenario when WiFi network has no connectivity and you want to send traffic through that network (something like captive portal). But it also explains the complete process and would work for normal networks. You won't find the exact code but it might still help in knowing where you got stuck.



回答5:

This works for me for a WPA connection. You don't need to add again a network if it is already saved.

private void connectToWifi(final String networkSSID, final String networkPassword) {
    int netID = -1;
    String confSSID = String.format("\"%s\"", networkSSID);
    String confPassword = String.format("\"%s\"", networkPassword);

    netID = getExistingNetworkID(confSSID, netID);
    /*
     * If ssid not found in preconfigured list it will return -1
     * then add new wifi
     */
    if (netID == -1) {

        Log.d(TAG,"New wifi config added");

        WifiConfiguration conf = new WifiConfiguration();
        conf.SSID = confSSID;
        conf.preSharedKey = confPassword;
        netID = wifiManager.addNetwork(conf);

    }
    wifiManager.disconnect();
    wifiManager.enableNetwork(netID, true);
    wifiManager.reconnect();
}

private int getExistingNetworkID (String confSSID, int netID){
    List<WifiConfiguration> wifiConfigurationList = wifiManager.getConfiguredNetworks();
    for (WifiConfiguration item : wifiConfigurationList){
        /*
          Find if the SSID is in the preconfigured list - if found get netID
         */
        if (item.SSID != null && item.SSID.equals(confSSID)){

            Log.d(TAG, "Pre-configured running");
            netID = item.networkId;
            break;
        }
    }
    return netID;
}


回答6:

Try this and enjoy:

 int res = mWifiManager.addNetwork(wifiConfiguration);
                                        if (res == -1) {
                            // Get existed network id if it is already added to WiFi network
                            res = getExistingNetworkId(wifiConfiguration.SSID);
                            Log.d(TAG, "getExistingNetwrkId: " + res);
                        }

      private int getExistingNetworkId(String SSID) {
            List<WifiConfiguration> configuredNetworks = mWifiManager.getConfiguredNetworks();
            if (configuredNetworks != null) {
                for (WifiConfiguration existingConfig : configuredNetworks) {
                    if (SSID.equalsIgnoreCase(existingConfig.SSID)) {
                        return existingConfig.networkId;
                    }
                }
            }
            return -1;
        }