Connect to Wifi programmatically not working for Android Marshmallow?

依然范特西╮ 提交于 2021-02-08 09:22:05

问题


String BACKSLASH = "\"";
String NETWROK_SECURITY_WEP = "WEP";
String NETWROK_SECURITY_NONE = "NONE";
String NETWROK_SECURITY_WPA = "WPA";
String NETWROK_SECURITY_WPA2 = "WPA2";
String NETWROK_SECURITY_WPA_WPA2 = "WPA/WPA2 PSK";
String NETWROK_ADDITIONAL_SECURITY_TKIP = "TKIP";
String NETWROK_ADDITIONAL_SECURITY_AES = "AES";
String NETWROK_ADDITIONAL_SECURITY_WEP = "WEP";
String NETWROK_ADDITIONAL_SECURITY_NONE = "NONE";
int FAILED_TO_ADD_NETWORK = -1;

WifiConfiguration conf = new WifiConfiguration();
String wifiName = sSid;
conf.SSID = BACKSLASH + wifiName + BACKSLASH;
String securityType = NETWROK_SECURITY_WPA_WPA2;

if (NETWROK_SECURITY_WEP.equalsIgnoreCase(securityType)) {
    conf.wepKeys[0] = pass;
    conf.wepTxKeyIndex = 0;
    conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
    conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
} else if (NETWROK_SECURITY_NONE.equalsIgnoreCase(securityType)) {
    conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
} else if (NETWROK_SECURITY_WPA.equalsIgnoreCase(securityType)
        || NETWROK_SECURITY_WPA2.equalsIgnoreCase(securityType)
        || NETWROK_SECURITY_WPA_WPA2.equalsIgnoreCase(securityType)) {
    conf.preSharedKey = BACKSLASH + pass + BACKSLASH;
    conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
    conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
    conf.status = WifiConfiguration.Status.ENABLED;
    conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
    conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
    conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
    conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
    conf.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
}
String wlanAdditionalSecurity = "";
if (NETWROK_ADDITIONAL_SECURITY_TKIP.equalsIgnoreCase(wlanAdditionalSecurity)) {
    conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
} else if (NETWROK_ADDITIONAL_SECURITY_AES.equalsIgnoreCase(wlanAdditionalSecurity)) {
    conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
} else if (NETWROK_ADDITIONAL_SECURITY_WEP.equalsIgnoreCase(wlanAdditionalSecurity)) {
    conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
    conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
} else if (NETWROK_ADDITIONAL_SECURITY_NONE.equalsIgnoreCase(wlanAdditionalSecurity)) {
    conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.NONE);
}
WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
int res = wifiManager.addNetwork(conf);
wifiManager.disconnect();
wifiManager.reconnect();

if (true) {

    wifiManager.enableNetwork(res, true);

    wifiManager.saveConfiguration();
    wifiManager.setWifiEnabled(true);

    new AppPreferences(mContext).setPrefrenceLong("connectTime", Calendar.getInstance().getTimeInMillis());
}
if (res != -1) {

    setFalseOther(mm);
    notifyDataSetChanged();

    Intent i = new Intent(mContext, Connect.class);
    i.putExtra("networkName", mm.getName());
    i.putExtra("networkId", mm.getId());
    i.putExtra("AdminID", mm.getUserId());
    i.putExtra("networkConnection", "true");

    mContext.startActivity(i);

} else {

}

This code is for connecting to WiFi. It's working fine on Android Lollipop but I want to set up configuration programmatically for Marshmallow. I've given all the run time permissions and dangerous permission but still no help and unable to remove saved WiFi passwords. If anyone has done this for Marshmallow it would be helpful.


回答1:


Well...We have small changes in the code for connect to the wifi network in Marshmallow.. I think the following code will works for you...

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);
        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:


well I think I have found the solution for this...tested and working fine..

public boolean connectToWifi(String knownSSID,String key) {

    try{
        //If Wifi is not enabled, enable it
        if (!mWifiManager.isWifiEnabled()) {
            Log.v(LOG_TAG, "Wifi is not enabled, enable it");
            mWifiManager.setWifiEnabled(true);
        }
        WifiConfiguration config = new WifiConfiguration();
        config.SSID = convertToQuotedString(knownSSID);
        // if key is empty means it is open network-- I am considering like this
        if(key.isEmpty()){
            config.allowedKeyManagement.set(KeyMgmt.NONE);
        } else {
            config.preSharedKey = convertToQuotedString(key);
        }

        int networkId = mWifiManager.addNetwork(config);
        // it will return -1 if the config is already saved..
        if(networkId == -1){
            networkId = getExistingNetworkId(config.SSID);
        }
        boolean es = mWifiManager.saveConfiguration();

        mWifiManager.disconnect();
        // giving time to disconnect here.
        Thread.sleep(3*1000);
        boolean bRet = mWifiManager.enableNetwork(networkId, true);
        mWifiManager.reconnect();

    } catch(InterruptedException e) {

    }

}

public 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;
}



回答3:


As of Android 6, you can not modify a wifi configuration that you did not create. If I recall, Android 6.0+ also does not need quotes around the SSID name anymore.

Here is my flow - slightly different from yours: addNetwork() saveConfiguration() enableNetwork()




回答4:


I have encountered this type of error in Android 6-Marshmallow. After searching and coding a lot I managed to solve the issue by adding an extra permission like the following:

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>

Hope this help for new comers.



来源:https://stackoverflow.com/questions/38346964/connect-to-wifi-programmatically-not-working-for-android-marshmallow

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!