Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android 6 : Connect to specific wifi network programmatically not working

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?

like image 710
chimaira Avatar asked Feb 21 '16 17:02

chimaira


People also ask

How do I connect to a specific WiFi network in android programmatically?

First and foremost, add permissions in your manifest file. These 4 permissions are required to make changes in your device network connectivity. Setup configuration to connect one specific wifi using WifiConfiguration. WifiConfiguration config = new WifiConfiguration();

How do I access WLAN settings on Android?

1. Tap Settings (System settings) > System (All settings) > Wireless & Networks > WLAN. Tap the WLAN slider to turn WLAN on. The device will scan for available WLAN networks and display a list of network names.


3 Answers

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" />
like image 176
Singam Avatar answered Nov 03 '22 10:11

Singam


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

like image 27
Rishabh Jain Avatar answered Nov 03 '22 10:11

Rishabh Jain


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.

like image 2
Nishkarsh Avatar answered Nov 03 '22 08:11

Nishkarsh