2011-03-27 11 views
26

So come ottenere una delle scansioni Android Wifi, ma non riesco a capire il modo migliore per fare una lista di schede da loro. Mi piacerebbe solo collegare SSID e BSSID da una delle scansioni a text1 e text2.Come posso ottenere risultati di scansione Wifi Android in un elenco?

esempi di ciò che ho fatto

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

E:

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

Mi piacerebbe vedere un po 'di codice che avete troppo . Stai ottenendo risultati come questo ?: Lista risultati = wifi.getScanResults(); – eternalmatt

+0

Lo sto già facendo solo per ottenere i messaggi di toast: 'wifi.startScan(); \t \t // ottenere l'elenco dei risultati in formato oggetto (come un array) \t \t Elenco results = wifi.getScanResults(); \t \t // ciclo che passa attraverso la lista \t \t per (risultato ScanResult: risultati) { \t \t \t Toast.makeText (questo, result.SSID + "" + result.level, \t \t \t \t \t Toast .LENGTH_SHORT) .show(); ' –

+0

@eternalmatt Sì, è esattamente come sto ottenendo risultati e funziona benissimo, ma non so come associarlo a una listview –

risposta

70

Prova questo codice

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> 

Per 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> 

aggiungere questi permessi in 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

thanku così tanto per questo codice.Finalmente vado a lavorare qualcosa dopo aver sbattuto la testa per così tanti giorni su wifi listview –

+1

@Android: Mi può dare il codice completo –

+0

@PoojaBalakrishnan: puoi darmi il codice completo? –

7

Wrap un ArrayAdapter attorno al List<ScanResult>. Sostituire getView() per popolare le righe con i dati ScanResult. Here is a free excerpt da uno dei miei libri che descrive come creare ArrayAdapters personalizzato come questo.

+0

puoi darmi la demo di questa domanda –

+0

Book sembra simpatico. Grazie – Robin

20

Inoltre per la risposta accettata avrete bisogno delle seguenti autorizzazioni nel vostro AndroidManifest per farlo funzionare:

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

Trova un esempio funzionante completo di seguito:

Il codice da @Android è molto buono, ma ha alcuni problemi, e cioè:

  1. popolando di codice ListView ha bisogno di essere spostati in OnReceive di BroadCastReceiver dove solo il risultato sarà disponibile. Nel caso il risultato è ottenuto al 2 ° tentativo.
  2. BroadCastReceiver deve essere annullato dopo aver ottenuto i risultati.
  3. size = size -1 sembra inutile.

seguito troverete il codice modificato di @Android come un esempio di lavoro:

WifiScanner.java che è la principale attività

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 che è il file di layout per l'attività

<?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> 

Inoltre, come accennato in precedenza, non dimenticate di aggiungere le autorizzazioni Wifi nel AndroidManifest.xml

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