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 ?