0

I wish to create an application, that detects the available wifi connections in the vicinity, and then connects to them. What I have done till now, is that I created a ListView that lists the available wifi connections, and then I created a LongItemClick dialog box, that shows the SSID and the BSSID of the network, and asks for the password. Now, I wish to connect to one of the networks, independent of what kind of network it is, it might be WEP, WPA or Open too. I am unable to get an overview of how should I connect to them. Can anyone help me with this ? I searched all available answers, and I didn't find any answer, that could help me do this!

EDIT:- I try the above thing by the below method. I create a list view of all the available wi-fi networks in the vicinity, and then I try to show the connection info on long press, and give an option to connect to the clicked wi-fi network via click.

package com.example.random;



import java.util.ArrayList;
import java.util.HashMap;    
import java.util.Iterator;
import java.util.List;    

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.FragmentManager;
import android.app.ListActivity;
import android.content.BroadcastReceiver;
import android.content.Context;    
import android.content.Intent;     
import android.content.IntentFilter;    
import android.net.wifi.ScanResult;    
import android.net.wifi.WifiConfiguration;   
import android.net.wifi.WifiConfiguration.AuthAlgorithm;
import android.net.wifi.WifiConfiguration.GroupCipher;
import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.net.wifi.WifiConfiguration.PairwiseCipher;
import android.net.wifi.WifiConfiguration.Protocol;
import android.net.wifi.WifiManager;    
import android.os.Bundle;    
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.util.Log;   
import android.view.LayoutInflater;
import android.view.View;    
import android.view.View.OnClickListener;    
import android.view.ViewGroup;
import android.widget.AdapterView;    
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Button;    
import android.widget.EditText;
import android.widget.ListView;    
import android.widget.SimpleAdapter;    
import android.widget.TextView;    
import android.widget.Toast;

public class MainActivity extends FragmentActivity implements OnClickListener
 {      
    WifiManager wifi;       
    ListView lv;
//    TextView textStatus;
    Button buttonScan;
    int size = 0;
    List<ScanResult> results;
    final Context context = this;
    EditText pass;
    String checkPassword = null;

    String ITEM_KEY = "key";
    ArrayList<HashMap<String, String>> arraylist = new ArrayList<HashMap<String, String>>();
    SimpleAdapter adapter;

    /* Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

//        textStatus = (TextView) findViewById(R.id.textStatus);
        buttonScan = (Button) findViewById(R.id.buttonScan);
        buttonScan.setOnClickListener(this);
        lv = (ListView)findViewById(R.id.list);
        lv.setOnItemClickListener(new OnItemClickListener(){

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                // TODO Auto-generated method stub
                connectToWifi(arg2);
            }



                private void connectToWifi(final int position)
                        {
                    final Dialog dialog = new Dialog(context);
                    dialog.setContentView(R.layout.connect);
                    dialog.setTitle("Connect to Network");
                    TextView textSSID = (TextView) dialog.findViewById(R.id.textSSID);
                    TextView textBSSID = (TextView) dialog.findViewById(R.id.textBSSID);
                    TextView capabilities = (TextView) dialog.findViewById(R.id.textCapabilities);

                    Button dialogButton = (Button) dialog.findViewById(R.id.dialogButtonOK);
                    pass = (EditText) dialog.findViewById(R.id.textPassword);
                    textSSID.setText(results.get(position).SSID);
                    textBSSID.setText(results.get(position).BSSID);
                    capabilities.setText(results.get(position).capabilities);
//                  textBSSID.setText(results.get(position).BSSID);
//                  textBSSID.setText(results.get(position).BSSID);
//                  
                    // if button is clicked, connect to the network;
                    dialogButton.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            checkPassword = pass.getText().toString();
                            finallyConnect(checkPassword);
                            dialog.dismiss();
                        }

                        private void finallyConnect(String checkPassword) {
                            String networkSSID = results.get(position).SSID;
                            String networkPass = checkPassword;

                            WifiConfiguration conf = new WifiConfiguration();
                            conf.SSID = "\"" + networkSSID + "\"";   // Please note the quotes. String should contain ssid in quotes
                            conf.preSharedKey = "\""+ networkPass +"\"";
                            WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); 
                            wifiManager.addNetwork(conf);

                            List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
                            for( WifiConfiguration i : list ) {
                                if(i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) {
                                     wifiManager.disconnect();
                                     if(wifiManager.enableNetwork(i.networkId, true)==true){
                                         wifiManager.enableNetwork(i.networkId, true);
                                         wifiManager.reconnect();
                                         int ipAddress = wifiManager.getConnectionInfo().getIpAddress();
                                         Toast.makeText(getApplicationContext(), ipAddress, Toast.LENGTH_SHORT).show();

                                         Toast.makeText(getApplicationContext(), networkSSID + "Connection successful", Toast.LENGTH_SHORT).show();                              
                                         }
                                     else{
                                     Toast.makeText(getApplicationContext(), "Connection Failed", Toast.LENGTH_SHORT).show();
                                     }
                                     break;

                                }
                            }

                        }
                    });
                    dialog.show();
                }
       });

        lv.setOnItemLongClickListener(new OnItemLongClickListener(){

            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3) {
                // TODO Auto-generated method stub
                showWifiSettings(arg2);
                return true;
            }

            private void showWifiSettings(int arg2) {
                showDialogOfOptions(arg2);
                    }

            private void showDialogOfOptions(int arg2) {
                // Create a custom Dialog
                final Dialog dialog = new Dialog(context);
                dialog.setContentView(R.layout.custom);
                dialog.setTitle("Network details");
                TextView textSSID = (TextView) dialog.findViewById(R.id.textSSID);
                TextView textBSSID = (TextView) dialog.findViewById(R.id.textBSSID);
                Button dialogButton = (Button) dialog.findViewById(R.id.dialogButtonOK);
                textSSID.setText(results.get(arg2).SSID);
                textBSSID.setText(results.get(arg2).BSSID);
                // if button is clicked, close the custom dialog
                dialogButton.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        dialog.dismiss();
                    }
                });

                dialog.show();
              }
            });

        wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        if (wifi.isWifiEnabled() == false)
        {
            Toast.makeText(getApplicationContext(), "wifi is disabled..making it enabled", Toast.LENGTH_LONG).show();
            wifi.setWifiEnabled(true);
        }   

        this.adapter = new SimpleAdapter(MainActivity.this, arraylist, R.layout.row, new String[] { ITEM_KEY }, new int[] { R.id.list_value });
        lv.setAdapter(this.adapter);

        registerReceiver(new BroadcastReceiver()
        {
            @Override
            public void onReceive(Context c, Intent intent) 
            {
               results = wifi.getScanResults();
               size = results.size();
            }
        }, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));                    
    }


    public void onClick(View view) 
    {


        arraylist.clear();          
        wifi.startScan();

        Toast.makeText(this, "Scanning...." + size, Toast.LENGTH_SHORT).show();
        try 
        {
            size = size - 1;
            while (size >= 0) 
            {   
                HashMap<String, String> item = new HashMap<String, String>();
                item.put(ITEM_KEY, results.get(size).SSID.toString()+ results.get(size).capabilities.toString());

                arraylist.add(item);
                size--;
                adapter.notifyDataSetChanged();                 
            }


           }
        catch (Exception e)
        { }         
    }    
}

The code, gives an error currently, when I try to get the IP address of the current connected network. LOGCAT:

06-30 18:20:02.515: E/AndroidRuntime(4564): FATAL EXCEPTION: main
06-30 18:20:02.515: E/AndroidRuntime(4564): Process: com.example.random, PID: 4564
06-30 18:20:02.515: E/AndroidRuntime(4564): java.lang.IndexOutOfBoundsException: Invalid index 6, size is 5
06-30 18:20:02.515: E/AndroidRuntime(4564):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
06-30 18:20:02.515: E/AndroidRuntime(4564):     at java.util.ArrayList.get(ArrayList.java:308)
06-30 18:20:02.515: E/AndroidRuntime(4564):     at com.example.random.MainActivity$1.connectToWifi(MainActivity.java:95)
06-30 18:20:02.515: E/AndroidRuntime(4564):     at com.example.random.MainActivity$1.onItemClick(MainActivity.java:79)
06-30 18:20:02.515: E/AndroidRuntime(4564):     at android.widget.AdapterView.performItemClick(AdapterView.java:299)
06-30 18:20:02.515: E/AndroidRuntime(4564):     at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
06-30 18:20:02.515: E/AndroidRuntime(4564):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2904)
06-30 18:20:02.515: E/AndroidRuntime(4564):     at android.widget.AbsListView$3.run(AbsListView.java:3638)
06-30 18:20:02.515: E/AndroidRuntime(4564):     at android.os.Handler.handleCallback(Handler.java:733)
06-30 18:20:02.515: E/AndroidRuntime(4564):     at android.os.Handler.dispatchMessage(Handler.java:95)
06-30 18:20:02.515: E/AndroidRuntime(4564):     at android.os.Looper.loop(Looper.java:136)
06-30 18:20:02.515: E/AndroidRuntime(4564):     at android.app.ActivityThread.main(ActivityThread.java:5017)
06-30 18:20:02.515: E/AndroidRuntime(4564):     at java.lang.reflect.Method.invokeNative(Native Method)
06-30 18:20:02.515: E/AndroidRuntime(4564):     at java.lang.reflect.Method.invoke(Method.java:515)
06-30 18:20:02.515: E/AndroidRuntime(4564):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
06-30 18:20:02.515: E/AndroidRuntime(4564):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
06-30 18:20:02.515: E/AndroidRuntime(4564):     at dalvik.system.NativeStart.main(Native Method)

The application does not give an option to connect to any of the wifi networks, when the list item is clicked currently, while when the wifiManager.getConfiguredNetworks().getIpAddress method wasn't added, it used to show the Toast line of Connection Successful, that meant that (wifiManager.enableNetwork(i.networkId, true) was true, but still it did not connect to the network.

Any help ?

BumbleBee
  • 103
  • 1
  • 3
  • 11
  • Check this answer out : http://stackoverflow.com/questions/8818290/how-to-connect-to-a-specific-wifi-network-in-android-programmatically – Shivam Verma Jun 30 '14 at 06:55
  • I checked the same answer out, but still, how to read the configuration of the network, how to read, whether it needs a password, how to use the password that I get from the main activity, and how to connect to any new network, that comes in the vicinity, is what is not very clear from the question. Can you help out in some other way ? – BumbleBee Jun 30 '14 at 06:58
  • Plus, the answer there deals with the different kinds of networks indifferently. – BumbleBee Jun 30 '14 at 06:59
  • Look through all the answers there, not just the accepted one. Covers up the topic really well. – Shivam Verma Jun 30 '14 at 07:01
  • Done. tried doing a part of everyone, but it didn't work. Plus unable to differentiate between every kind of network, as I want the app to discover and connect to any possible network – BumbleBee Jun 30 '14 at 07:04
  • Check the documentation of `WifiManger` class [here](http://developer.android.com/reference/android/net/wifi/WifiManager.html). – shujj Jun 30 '14 at 07:08
  • How do I enable the configuration and use the user entered password to connect to the corresponding network, like the one that is used by default in the Android phones ? – BumbleBee Jun 30 '14 at 07:10
  • @shujj - I did try going through whatever documentation you presented, but the router that I have with me, the application does not get connected to it. Can you please help me ? – BumbleBee Jun 30 '14 at 11:35
  • @ShivamVerma - I went through the answer that you referred, no help! – BumbleBee Jun 30 '14 at 11:35
  • Did you try anything? Any code that you tried but it's not working? – Shivam Verma Jun 30 '14 at 11:40
  • @ShivamVerma - Please watch the updated question, I have added all the updates in the question itself, plus the doubt is updated too! – BumbleBee Jun 30 '14 at 12:57

1 Answers1

0

This code works. It searches the list of WiFi available and displays it on list view, and by clicking on the list view, a dialog box appears showing SSID, BSSID and password to enter.

MainActivity:

import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private WifiManager wifi;
    WifiScanReceiver wifiReciever;
    private ListView lv;
    // TextView textStatus;
    private Button buttonScan;
    private int size = 0;
    private List<ScanResult> results;
    private final Context context = this;
    private EditText pass;
    private String checkPassword = null;
    private String ITEM_KEY = "key";
    private ArrayList<HashMap<String, String>> arraylist = new ArrayList<HashMap<String, String>>();
    private SimpleAdapter adapter;
    String wifis[];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        buttonScan = (Button) findViewById(R.id.buttonScan);
        buttonScan.setOnClickListener(this);
        lv = (ListView) findViewById(R.id.list);
        wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        wifiReciever = new WifiScanReceiver();
        wifi.startScan();

        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                    long arg3) {
                // TODO Auto-generated method stub
                connectToWifi(arg2);
            }
        });

        lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                                           int arg2, long arg3) {
                // TODO Auto-generated method stub
                showWifiSettings(arg2);
                return true;
            }
        });

        if (wifi.isWifiEnabled() == false) {
            Toast.makeText(getApplicationContext(),
                    "wifi is disabled..making it enabled", Toast.LENGTH_LONG)
                    .show();
            wifi.setWifiEnabled(true);
        }

        this.adapter = new SimpleAdapter(MainActivity.this, arraylist,
                R.layout.custom  , new String[] { ITEM_KEY },      //concentrate
                new int[] { R.id.list });
        lv.setAdapter(adapter);

        registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context c, Intent intent) {
                results = wifi.getScanResults();
                size = results.size();
            }
        }, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
    }

    @Override
    public void onClick(View view) {
        //arraylist.clear();
        wifi.startScan();
        Toast.makeText(this, "Scanning...." + size, Toast.LENGTH_SHORT).show();
        try {
            size = size - 1;
            while (size >= 0) {
                HashMap<String, String> item = new HashMap<String, String>();
                item.put(ITEM_KEY,
                        results.get(size).SSID.toString()
                                + results.get(size).capabilities.toString());
                arraylist.add(item);
                size--;
                adapter.notifyDataSetChanged();
            }
        } catch (Exception e) {
        }
    }

    protected void onPause() {
        unregisterReceiver(wifiReciever);
        super.onPause();
    }

    protected void onResume() {
        registerReceiver(wifiReciever, new IntentFilter(
                WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
        super.onResume();
    }

    class WifiScanReceiver extends BroadcastReceiver {
        @SuppressLint("UseValueOf")
        public void onReceive(Context c, Intent intent) {
            List<ScanResult> wifiScanList = wifi.getScanResults();
            wifis = new String[wifiScanList.size()];
            for(int i = 0; i < wifiScanList.size(); i++){
                wifis[i] = ((wifiScanList.get(i)).toString());
            }
            String filtered[] = new String[wifiScanList.size()];
            int counter = 0;
            for (String eachWifi : wifis) {
                String[] temp = eachWifi.split(",");
                filtered[counter] = temp[0].substring(5).trim()+"\n" + temp[2].substring(12).trim()+"\n" +temp[3].substring(6).trim();//0->SSID, 2->Key Management 3-> Strength
                counter++;
            }
            lv.setAdapter(new ArrayAdapter<String>(getApplicationContext(),
                    android.R.layout.simple_list_item_1, filtered));
        }
    }

    private void showWifiSettings(int arg2) {
        showDialogOfOptions(arg2);
    }

    private void showDialogOfOptions(int arg2) {
        // Create a custom Dialog
        final Dialog dialog = new Dialog(context);
        dialog.setContentView(R.layout.custom);
        dialog.setTitle("Network details");
        TextView textSSID = (TextView) dialog.findViewById(R.id.textSSID1);
        TextView textBSSID = (TextView) dialog.findViewById(R.id.textBSSID1);
        Button dialogButton = (Button) dialog.findViewById(R.id.okButton);
        textSSID.setText(results.get(arg2).SSID);
        textBSSID.setText(results.get(arg2).BSSID);
        // if button is clicked, close the custom dialog
        dialogButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });

        dialog.show();
    }

    private void finallyConnect(String checkPassword, int position) {
        String networkSSID = results.get(position).SSID;
        String networkPass = checkPassword;
        WifiConfiguration wifiConfig = new WifiConfiguration();
        wifiConfig.SSID = String.format("\"%s\"", networkSSID);
        wifiConfig.preSharedKey = String.format("\"%s\"", networkPass);
        // remember id
        int netId = wifi.addNetwork(wifiConfig);
        wifi.disconnect();
        wifi.enableNetwork(netId, true);
        wifi.reconnect();

        WifiConfiguration conf = new WifiConfiguration();
        conf.SSID = "\"\"" + networkSSID + "\"\"";
        conf.preSharedKey = "\"" + networkPass + "\"";
        wifi.addNetwork(conf);
    }

    private void connectToWifi(final int position) {
        final Dialog dialog = new Dialog(context);
        dialog.setContentView(R.layout.custom);
        dialog.setTitle("Connect to Network");
        TextView textSSID = (TextView) dialog.findViewById(R.id.textSSID1);
        TextView textBSSID = (TextView) dialog.findViewById(R.id.textBSSID1);
        TextView capabilities = (TextView) dialog
                .findViewById(R.id.textCapabilities);
        Button dialogButton = (Button) dialog.findViewById(R.id.okButton);
        pass = (EditText) dialog.findViewById(R.id.textPassword);
        textSSID.setText(results.get(position).SSID);
        textBSSID.setText(results.get(position).BSSID);
        capabilities.setText(results.get(position).capabilities);
        //
        // if button is clicked, connect to the network;
        dialogButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                checkPassword = pass.getText().toString();
                finallyConnect(checkPassword, position);
                dialog.dismiss();
            }
        });
        dialog.show();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

XML file:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="scan"
    android:id="@+id/buttonScan"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

<ListView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/list"
    android:layout_centerHorizontal="true"
    android:layout_below="@+id/buttonScan" />
Pang
  • 9,564
  • 146
  • 81
  • 122
Akash B
  • 31
  • 1
  • 1
  • 6