8

I am building an application that allows the user to connect to their local wifi network without leaving. However, whenever I select an item on the list the wrong network id comes up, and it connects to the wrong network. I've noticed that:

  • If I have three available networks, and I select the top one, the bottom one appears to connect to.
  • The reverse is true as well
  • When I select the middle one it actually works.

Here is my code below:

//from `onCreate` method
Button buttonScan = (Button) findViewById(R.id.buttonScan);
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
ListView lv = (ListView) findViewById(R.id.list);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        connectToWifi(arg2);
    }
});
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        return true;
    }
});

if (!wifi.isWifiEnabled()) {
    Toast.makeText(getApplicationContext(), "Enabling Wifi", Toast.LENGTH_LONG).show();
    wifi.setWifiEnabled(true);
}

SimpleAdapter adapter = 
        new SimpleAdapter(
                NetworkCalibration.this,
                arraylist,
                R.layout.wifi_list_row,
                new String[] { ITEM_KEY },
                new int[] { R.id.listValue });
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));

Selecter(hNum, vNum);

buttonScan.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        noob = false;
        SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
        SharedPreferences.Editor editor = settings.edit();
        editor.putBoolean("Newbie", noob);
        editor.commit();
        arraylist.clear();
        wifi.startScan();

        Toast.makeText(getApplicationContext(), "Scanning...", 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) {
            e.printStackTrace();
        }
    }
});

public void finallyConnect(String checkPassword, int position) {
    String networkSSID = results.get(position).SSID;
    WifiConfiguration wifiConfiguration = new WifiConfiguration();
    wifiConfiguration.SSID = "\""+ networkSSID +"\"";
    wifiConfiguration.preSharedKey ="\""+ checkPassword +"\"";
    WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
    int netId = wifiManager.addNetwork(wifiConfiguration);

    if (!wifiManager.isWifiEnabled()) { //---wifi is turned on---
        //---disconnect it first---
        wifiManager.setWifiEnabled(true);
    }
    wifiManager.enableNetwork(netId, true);
    wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL, networkSSID);
    wifiManager.reconnect();
    wifiManager.saveConfiguration();

    /* 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);*/
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putBoolean("Connected",isConnected);
    editor.commit();
}

private void connectToWifi(final int position) {
    final Dialog dialog = new Dialog(context);
    dialog.setContentView(R.layout.wifi_connect);
    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);
    pass.requestFocus();
    InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.showSoftInput(pass, InputMethodManager.SHOW_IMPLICIT);
    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);
            statusText.setText("Connecting...");
            statusText.setTextColor(Color.parseColor("#000000"));
            CheckConnection();
            dialog.dismiss();
        }
    });
    dialog.show();
}

Any idea why this would be happening? Thanks everyone!

2
  • sorry, not about your question but i don't fully understand what your app doing. connecting a network without leaving what? Commented Jun 6, 2016 at 0:37
  • 1
    @ÖzgürBağcı Without leaving the application. It can connect to the internet internally. Commented Jun 6, 2016 at 15:12

2 Answers 2

5

I fixed this issue by inverting a few signs in my code and by redefining a few variables. Final working code below:

try {
size = 0;
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) {
}

And wha'la!

Sign up to request clarification or add additional context in comments.

Comments

1

When you add the items to the adapter, you are iterating in an inverse way. That is, your are taking the last item from results and storing it in the first place of arraylist. I suggest you simply inverse the current loop by change this code:

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) {
}

for this one:

try {
    for (int i = 0; i < size; i++ ) {
        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);
        adapter.notifyDataSetChanged();
    }

} catch (Exception e) {
}

3 Comments

I added wifi.startScan to the top of the try block but nothing appears int he called arraylist
Have you tried inverting the loop as I suggested?
Yes I replaced my chunk of code with your suggestion from above, none of the surrounding networks displayed into the array adapter

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.