How to connect Wi-Fi programmatically in Android 10

694 Views Asked by At

I have written Wi-Fi connection function for Android 10. It works on Android 10 version mobile phones. It connects the respective Wi-Fi, but after the successful connection of Wi-Fi. It lost the access of internet.

My app requirement is connect Wi-Fi programmatically with internet access. So, please help me finding the solution for that.

My function is given below,

public static void connectToWiFi(final Context cntx, String ssid, String key) {
    int securityType = 1;
    int highestPriorityNumber = 0;
    WifiConfiguration selectedConfig = null;

    mainWifiObj = (WifiManager)  cntx.getSystemService(Context.WIFI_SERVICE);

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
    {
        System.out.println("Wi-Fi Status: "+ mainWifiObj.isWifiEnabled());
        if (!mainWifiObj.isWifiEnabled()) {
            returnWifConnection("1234", "enableWifi");
        }
    }else{
        if (!mainWifiObj.isWifiEnabled()) {
            mainWifiObj.setWifiEnabled(true);
            System.out.println("Wifi is enabled");
        }
    }
    /* Check if not connected but has connected to that wifi in the past */
    for (WifiConfiguration config : mainWifiObj.getConfiguredNetworks()) {
        if (config.priority > highestPriorityNumber) highestPriorityNumber = config.priority;
        if (config.SSID.equals(quoted(ssid)) && config.allowedKeyManagement.get(securityType)) {
            System.out.println("Saved preshared key is " + config.preSharedKey);

            if (securityType == WifiConfiguration.KeyMgmt.WPA_PSK
                    && config.preSharedKey != null && config.preSharedKey.equals(key))
                selectedConfig = config;

            else if (securityType == WifiConfiguration.KeyMgmt.NONE)
                selectedConfig = config;
        }
    }

    if (selectedConfig != null) {
        selectedConfig.priority = highestPriorityNumber + 1;
        mainWifiObj.updateNetwork(selectedConfig);
        // mainWifiObj.disconnect(); /* disconnect from whichever wifi you're connected to */
        WifiInfo wifiInfo = mainWifiObj.getConnectionInfo();
        String str = wifiInfo.getSSID().replace("\"", "");
        System.out.print("wifiInfo.getSSID()1: " +str);
        if(str.equals(ssid)){
            //            mainWifiObj.disconnect(); 
            //            mainWifiObj.setWifiEnabled(false);
            isSameWifi = true;
            System.out.print("\nSSID is same1");
        }else{
            isSameWifi = false;
            System.out.print("\nSSID is different1");
        }
        mainWifiObj.enableNetwork(selectedConfig.networkId, true);
        mainWifiObj.reconnect();
        System.out.println("Connection exists in past, enabling and connecting priority =  " + highestPriorityNumber);
    }

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
    {
        WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
        builder.setSsid(ssid);
        builder.setWpa2Passphrase(key);

        WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();

        NetworkRequest.Builder networkRequestBuilder1 = new NetworkRequest.Builder();
        networkRequestBuilder1.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
        networkRequestBuilder1.setNetworkSpecifier(wifiNetworkSpecifier);
        
        NetworkRequest nr = networkRequestBuilder1.build();
        System.out.println("Android sdk version is 29 above NetworkRequest");
        final ConnectivityManager cm = (ConnectivityManager)
        cntx.getSystemService(Context.CONNECTIVITY_SERVICE);
        System.out.println("Android sdk version is 29 above ConnectivityManager");
        ConnectivityManager.NetworkCallback networkCallback = new
                ConnectivityManager.NetworkCallback()
                {
                    @Override
                    public void onAvailable(Network network)
                    {
                        super.onAvailable(network);
                        System.out.println("onAvailabile" + network);
                        cm.bindProcessToNetwork(network);

                    }

                    @Override
                    public void onLosing(@NonNull Network network, int maxMsToLive)
                    {
                        super.onLosing(network, maxMsToLive);
                        System.out.println("onLosing" + network);
                    }

                    @Override
                    public void onLost(@NonNull Network network)
                    {
                        super.onLost(network);
                        System.out.println("onLost" + network);
                    }

                    @Override
                    public void onUnavailable()
                    {
                        super.onUnavailable();
                        System.out.println("onUnavaliable");
                    }
                };
        System.out.println("Android sdk version is 29 above NetworkCallback");
        cm.requestNetwork(nr, networkCallback);
    }
    else
    {

        /* Make new connection */
        WifiConfiguration config = new WifiConfiguration();
        config.SSID = quoted(ssid);
        config.priority = highestPriorityNumber + 1;
        config.status = WifiConfiguration.Status.ENABLED;
        if (securityType == WifiConfiguration.KeyMgmt.WPA_PSK) {
            config.preSharedKey = quoted(key);
            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
            config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
            config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
            config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
            config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
        }else {
            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
        }

        System.out.println("Attempting new wifi connection, setting priority number to, connecting " + config.priority);

        int netId = mainWifiObj.addNetwork(config);
        //    mainWifiObj.disconnect(); /* disconnect from whichever wifi you're connected to */

        ConnectivityManager connManager = (ConnectivityManager) cntx.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

        if (mWifi.isConnected()) { /* Check for all networks are forget in mobile. */
            WifiInfo wifiInfo = mainWifiObj.getConnectionInfo();
            String str = wifiInfo.getSSID().replace("\"", "");
            System.out.print("wifiInfo.getSSID(): " +str);
            if(str.equals(ssid)){
                //            mainWifiObj.disconnect();
                //            mainWifiObj.setWifiEnabled(false);
                isSameWifi = true;
                System.out.print("\nSSID is same");
            }else{
                isSameWifi = false;
                System.out.print("\nSSID is different");
            }
        }
        mainWifiObj.enableNetwork(netId, true);
        boolean isConnect = mainWifiObj.reconnect(); // todo?
        System.out.println("Is Connect -> " + isConnect);
    }
}
0

There are 0 best solutions below