如何将Android Wifi扫描结果放入列表?

时间:2011-03-27 22:32:11

标签: java android listview android-wifi

我知道如何获得<List> Android Wifi扫描,但我无法找出制作列表适配器的最佳方法。我想将<List>扫描中的SSID和BSSID绑定到text1和text2。

我一直在做的样品

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();

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

5 个答案:

答案 0 :(得分:79)

试试此代码

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>

对于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>

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" />

答案 1 :(得分:21)

除了已接受的答案,您还需要在 AndroidManifest 中获得以下权限才能使其正常运行:

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

答案 2 :(得分:8)

ArrayAdapter周围包裹List<ScanResult>。覆盖getView()以使用ScanResult数据填充您的行。 Here is a free excerpt来自我的一本书,其中介绍了如何创建这样的自定义ArrayAdapters

答案 3 :(得分:4)

查找下面的完整工作示例:

@Android的代码非常好但几乎没有问题,即:

  1. 需要将填充到ListView代码移动到BroadCastReceiver的onReceive,其中只有结果可用。在第二次尝试时获得结果。
  2. 获得结果后,需要取消注册BroadCastReceiver。
  3. size = size -1似乎没必要。
  4. 在下面找到@Android的修改代码作为工作示例:

    WifiScanner.java是主要活动

    package com.arjunandroid.wifiscanner;
    
    import android.app.Activity;
    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.WifiManager;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class WifiScanner extends Activity implements View.OnClickListener{
    
    
        WifiManager wifi;
        ListView lv;
        Button buttonScan;
        int size = 0;
        List<ScanResult> results;
    
        String ITEM_KEY = "key";
        ArrayList<String> arraylist = new ArrayList<>();
        ArrayAdapter adapter;
    
        /* Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            getActionBar().setTitle("Widhwan Setup Wizard");
    
            setContentView(R.layout.activity_wifi_scanner);
    
            buttonScan = (Button) findViewById(R.id.scan);
            buttonScan.setOnClickListener(this);
            lv = (ListView)findViewById(R.id.wifilist);
    
    
            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 ArrayAdapter<>(this,android.R.layout.simple_list_item_1,arraylist);
            lv.setAdapter(this.adapter);
    
            scanWifiNetworks();
        }
    
        public void onClick(View view)
        {
            scanWifiNetworks();
        }
    
        private void scanWifiNetworks(){
    
            arraylist.clear();
            registerReceiver(wifi_receiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
    
            wifi.startScan();
    
            Log.d("WifScanner", "scanWifiNetworks");
    
            Toast.makeText(this, "Scanning....", Toast.LENGTH_SHORT).show();
    
        }
    
        BroadcastReceiver wifi_receiver= new BroadcastReceiver()
        {
    
            @Override
            public void onReceive(Context c, Intent intent)
            {
                Log.d("WifScanner", "onReceive");
                results = wifi.getScanResults();
                size = results.size();
                unregisterReceiver(this);
    
                try
                {
                    while (size >= 0)
                    {
                        size--;
                        arraylist.add(results.get(size).SSID);
                        adapter.notifyDataSetChanged();
                    }
                }
                catch (Exception e)
                {
                    Log.w("WifScanner", "Exception: "+e);
    
                }
    
    
            }
        };
    
    }
    

    activity_wifi_scanner.xml,它是活动的布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:padding="10dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <ListView
            android:id="@+id/wifilist"
            android:layout_width="match_parent"
            android:layout_height="312dp"
            android:layout_weight="0.97" />
    
    
        <Button
            android:id="@+id/scan"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_gravity="bottom"
            android:layout_margin="15dp"
            android:background="@android:color/holo_green_light"
            android:text="Scan Again" />
    </LinearLayout>
    

    同样如上所述,不要忘记在AndroidManifest.xml中添加Wifi权限

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

答案 4 :(得分:0)

请参阅以下链接,了解从列表中删除冗余ssid的ScanResult

duplicate SSID in scanning wifi result