it-swarm.com.de

Wie kann ich Android Wifi Scan-Ergebnisse in eine Liste aufnehmen?

Ich weiß, wie man Android-Wifi-Scans erhält, aber ich kann nicht herausfinden, wie man einen Listenadapter daraus macht. Ich möchte einfach SSID und BSSID von Scans an text1 und text2 binden.

Beispiele von dem, was ich gemacht habe 

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

Und:

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);
    }
28
Seth Hikari

Versuchen Sie diesen 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>

Für 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>

Fügen Sie diese Berechtigung in AndroidManifest.xml hinzu.

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

Für die akzeptierte Antwort benötigen Sie außerdem die folgenden Berechtigungen in Ihrem AndroidManifest , damit es funktioniert:

 <uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE" />
 <uses-permission Android:name="Android.permission.CHANGE_WIFI_STATE" /> 
21
Carlos

Wickeln Sie eine ArrayAdapter um Ihren List<ScanResult>. Überschreiben Sie getView(), um Ihre Zeilen mit den ScanResult-Daten zu füllen. Hier ist ein kostenloser Auszug aus einem meiner Bücher, in dem beschrieben wird, wie man benutzerdefinierte ArrayAdapters-Dateien erstellt.

8
CommonsWare

Unten finden Sie ein vollständiges Arbeitsbeispiel:

Der Code von @Android ist sehr gut, hat aber einige Probleme, nämlich:

  1. Das Auffüllen in ListView-Code muss in onReceive von BroadCastReceiver verschoben werden, wo nur das Ergebnis verfügbar ist. In diesem Fall wird das Ergebnis beim 2. Versuch erhalten.
  2. BroadCastReceiver muss nach Erhalt der Ergebnisse nicht registriert werden.
  3. size = size -1 scheint unnötig.

Nachfolgend den modifizierten Code von @Android als Arbeitsbeispiel:

WifiScanner.Java ist die Hauptaktivität

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 ist die Layoutdatei für die Aktivität

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

Vergessen Sie auch nicht, in der AndroidManifest.xml WLAN-Berechtigungen hinzuzufügen

<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE" />
<uses-permission Android:name="Android.permission.CHANGE_WIFI_STATE" /> 
4
antman

siehe untenstehenden Link, um ScanResult zu erhalten, bei dem redundante ssid aus der Liste entfernt wurde

SSID beim Scannen des WLAN-Ergebnisses duplizieren

0
vikoo