Как я могу получить результаты сканирования Android Wifi в список?

Я знаю, как получить Android Wifi Scans, но я не могу найти лучший способ сделать из них адаптер списка. Я хотел бы просто привязать 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); } 

Solutions Collecting From Web of "Как я могу получить результаты сканирования Android Wifi в список?"

Попробуйте этот код

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

Кроме того, для принятого ответа вам понадобятся следующие разрешения в вашем AndroidManifest, чтобы заставить его работать:

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

Оберните ArrayAdapter вокруг вашего List<ScanResult> . Переопределите getView() чтобы заполнить ваши строки данными ScanResult . Вот бесплатная выдержка из одной из моих книг, которая описывает, как создавать пользовательские ArrayAdapters как это.

См. Ссылку для получения ScanResult с избыточным ssid, удаленным из списка

Дублировать SSID в результатах сканирования wifi

Найдите полный рабочий пример ниже:

Код от @Android очень хорош, но имеет несколько проблем, а именно:

  1. Заполнение кода ListView необходимо перенести в onReceive of BroadCastReceiver, где будет доступен только результат. В случае, когда результат получается при 2-й попытке.
  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, который является файлом макета для Activity

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

Также, как упоминалось выше, не забудьте добавить разрешения Wifi в AndroidManifest.xml

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