Search code examples
javaandroidlistviewandroid-wifi

How can I get Android Wifi Scan Results into a list?


I know how to get a <List> of Android Wifi Scans but I can not figure out the best way to make a list adapter out of them. I would like to just bind SSID and BSSID from a <List> of scans to text1 and text2.

Samples of what I have been doing

wifi.startScan();
        // get list of the results in object format ( like an array )
        List<ScanResult> results = wifi.getScanResults();`

        // loop that goes through list
        for (ScanResult result : results) {
            Toast.makeText(this, result.SSID + " " + result.level,
                    Toast.LENGTH_SHORT).show();

And:

private void fillDataFromDb() {
        Cursor scanCursor = Db.fetchAllScans();
        startManagingCursor(scanCursor);`

        // Create an array to specify the fields we want to display in the list
        // (only TITLE)
        String[] from = new String[] { WifiDbAdapter.KEY_BSSID,
                WifiDbAdapter.KEY_SSID };

        // and an array of the fields we want to bind those fields to (in this
        // case just text1)
        int[] to = new int[] { R.id.text1, R.id.text2 };

        // Now create a simple cursor adapter and set it to display
        SimpleCursorAdapter scansdb = new SimpleCursorAdapter(this,
                R.layout.scan_row, scanCursor, from, to);
        setListAdapter(scansdb);
    }

Solution

  • Try this code

    public class WiFiDemo extends Activity implements OnClickListener
     {      
        WifiManager wifi;       
        ListView lv;
        TextView textStatus;
        Button buttonScan;
        int size = 0;
        List<ScanResult> results;
    
        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);
    
            wifi = (WifiManager) getApplicationContext().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(WiFiDemo.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 + "  " + results.get(size).capabilities);
    
                    arraylist.add(item);
                    size--;
                    adapter.notifyDataSetChanged();                 
                } 
            }
            catch (Exception e)
            { }         
        }    
    }
    

    WiFiDemo.xml :

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="16dp"
        android:orientation="vertical">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:orientation="horizontal">
    
            <TextView
                android:id="@+id/textStatus"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Status" />
    
            <Button
                android:id="@+id/buttonScan"
                android:layout_width="wrap_content"
                android:layout_height="40dp"
                android:text="Scan" />
        </LinearLayout>
    
        <ListView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="20dp"></ListView>
    </LinearLayout>
    

    For ListView- row.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="8dp">
    
        <TextView
            android:id="@+id/list_value"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="14dp" />
    </LinearLayout>
    

    Add these permission in AndroidManifest.xml

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />