2011-03-27 61 views
26

我知道如何獲得Android Wifi掃描,但我無法弄清楚製作列表適配器的最佳方式。我想只將SSID和BSSID從一次掃描綁定到text1和text2。什麼我一直在做如何將Android Wifi掃描結果放入列表中?

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

我想看到一些代碼,你有太多。你是否得到這樣的結果?:列表 results = wifi.getScanResults(); – eternalmatt 2011-03-27 22:40:14

+0

我已經這樣做了,只是得到吐司消息: 'wifi.startScan(); \t \t //以對象格式獲得結果列表(如數組) \t \t列表 results = wifi.getScanResults(); \t \t //循環通過列表 \t \t無二(ScanResult結果:結果){ \t \t \t Toast.makeText(這一點,result.SSID + 「」 + result.level, \t \t \t \t \t吐司.LongTH_SHORT).show();' – 2011-03-27 23:08:52

+0

@eternalmatt是的,這正是我如何得到的結果,它的工作原理,只是不知道如何綁定到列表視圖 – 2011-03-27 23:14:26

回答

70

試試這個代碼

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> 

Androi添加這些權限dManifest.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" /> 
+2

非常感謝這個code.Finally我去撞了我的頭在無線上的這麼多天後的工作listview – 2012-04-05 08:21:44

+1

@Android:你可以給我完整的代碼 – 2012-12-13 08:00:24

+0

@PoojaBalakrishnan:你能給我完整的代碼嗎? – 2012-12-13 08:01:02

7

包裝你List<ScanResult>圍繞ArrayAdapter。覆蓋getView()以使用ScanResult數據填充行。 Here is a free excerpt來自我的一本書,涵蓋了如何創建像這樣的自定義ArrayAdapters

+0

你能給我這個問題的演示 – 2012-12-14 06:40:05

+0

看起來似乎不錯。謝謝 – Robin 2013-11-19 15:17:08

20

除了對接受的答案,你需要以下權限到你的AndroidManifest得到它的工作:

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

下面爲一個完整的工作示例:

通過@android的代碼是非常好的,但有幾個問題,即:

  1. 填充到ListView控件的代碼需要被移動到廣播接收器中的onReceive只有結果將是可用的。在第二次嘗試中獲得結果的情況下。
  2. 獲得結果後,BroadCastReceiver需要取消註冊。
  3. size = size -1似乎沒有必要。

查找@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中添加無線上網的權限

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