2011-03-27 11 views
26

Sé cómo obtener un Android Wifi Scans pero no puedo encontrar la mejor manera de hacerles un adaptador de lista. Me gustaría simplemente enlazar SSID y BSSID desde un escaneo a texto1 y texto2.¿Cómo puedo obtener resultados de escaneo de Android WiFi en una lista?

muestras de lo que he estado haciendo

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

Y:

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

me gustaría ver algo de código que tiene demasiado . ¿Estás obteniendo resultados como este ?: List results = wifi.getScanResults(); – eternalmatt

+0

Ya estoy haciendo esto para obtener mensajes tostados: 'wifi.startScan(); \t \t // obtener una lista de los resultados en formato de objeto (como una matriz) \t \t Lista results = wifi.getScanResults(); \t \t // bucle que pasa a través de la lista de \t \t para (resultado ScanResult: resultados) { \t \t \t Toast.makeText (esto, result.SSID + "" + result.level, \t \t \t \t \t tostada .LENGTH_SHORT) .show(); ' –

+0

@eternalmatt Sí, así es exactamente como obtengo los resultados y funciona muy bien, simplemente no sé cómo vincular eso a una lista de vista –

Respuesta

70

Prueba este código

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> 

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

agregar estos permisos en 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

muchas gracias por este código.Por fin voy a trabajar después de golpearme la cabeza por tantos días en la lista de wifi –

+1

@Android: ¿Pueden darme el código completo –

+0

@PoojaBalakrishnan: me pueden dar el código completo? –

7

Wrap un ArrayAdapter alrededor de su List<ScanResult>. Omita getView() para llenar sus filas con los datos ScanResult. Here is a free excerpt de uno de mis libros que cubre cómo crear personalizado ArrayAdapters de esta manera.

+0

¿me puede dar una demostración de esta pregunta? –

+0

Libro parece bonito. Gracias – Robin

20

Además de la respuesta aceptada que necesita los siguientes permisos en su AndroidManifest para que funcione:

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

Encuentre un ejemplo de trabajo completa a continuación:

El código por @Android es muy bueno, pero tiene algunos problemas, a saber:

  1. Rellenar con el código ListView tiene que ser trasladado a OnReceive de BroadcastReceiver donde sólo el resultado estará disponible. En el caso, el resultado se obtiene en el segundo intento.
  2. BroadCastReceiver debe ser no registrado después de obtener los resultados.
  3. size = size -1 parece innecesario.

encontrar más adelante el código modificado de @Android como un ejemplo de trabajo:

WifiScanner.java que es la actividad principal

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, que es el archivo de diseño para la Actividad

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

También como se mencionó anteriormente, no se olvide de agregar permisos Wifi en el AndroidManifest.xml

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