как получить доступ к Wi-Fi-сетям и отобразить их в списке в android

friends.I хочу найти все доступные WiFi-сети и отобразить их в списке, который я пробовал, как показано ниже. Но его не работает. Я отредактировал мой код, и теперь я получил результат, но со всем результатом, который мне не нужен. I нужно только имя Wi-Fi сети в моем списке.

package com.example.wifilistdemo; import java.util.List; 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.view.Menu; import android.view.MenuItem; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { TextView mainText; WifiManager mainWifi; WifiReceiver receiverWifi; List wifiList; StringBuilder sb = new StringBuilder(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mainText = (TextView) findViewById(R.id.tv1); mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); if (mainWifi.isWifiEnabled() == false) { // If wifi disabled then enable it Toast.makeText(getApplicationContext(), "wifi is disabled..making it enabled", Toast.LENGTH_LONG).show(); mainWifi.setWifiEnabled(true); } receiverWifi = new WifiReceiver(); registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); mainWifi.startScan(); mainText.setText("Starting Scan..."); } public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, 0, 0, "Refresh"); return super.onCreateOptionsMenu(menu); } public boolean onMenuItemSelected(int featureId, MenuItem item) { mainWifi.startScan(); mainText.setText("Starting Scan"); return super.onMenuItemSelected(featureId, item); } protected void onPause() { unregisterReceiver(receiverWifi); super.onPause(); } protected void onResume() { registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); super.onResume(); } // Broadcast receiver class called its receive method // when number of wifi connections changed class WifiReceiver extends BroadcastReceiver { // This method call when number of wifi connections changed public void onReceive(Context c, Intent intent) { sb = new StringBuilder(); wifiList = mainWifi.getScanResults(); sb.append("\n Number Of Wifi connections :"+wifiList.size()+"\n\n"); for(int i = 0; i < wifiList.size(); i++){ sb.append(new Integer(i+1).toString() + ". "); sb.append((wifiList.get(i)).toString()); sb.append("\n\n"); } mainText.setText(sb); } } } 

Вам необходимо создать BroadcastReceiver для прослушивания результатов проверки Wi-Fi:

 private final BroadcastReceiver mWifiScanReceiver = new BroadcastReceiver() { @Override public void onReceive(Context c, Intent intent) { if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { List mScanResults = mWifiManager.getScanResults(); // add your logic here } } } 

В onCreate() вы назначили mWifiManager и инициируете сканирование:

 mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); registerReceiver(mWifiScanReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); mWifiManager.startScan(); 

getScanResults() возвращает данные только в том случае, если у вас есть соответствующие разрешения. Для этого добавьте одну из двух следующих строк в ваш AndroidManifest.xml :

   

Также обратите внимание, что в API 23+ разрешения должны запрашиваться во время выполнения. (Для лабораторной среды вы также можете предоставить разрешения вручную в настройках вместо менее требуемого кодирования, но не рекомендуется для приложения конечного пользователя).

Обратите внимание, что код, который обрабатывает ваши результаты сканирования, будет запускаться каждый раз, когда будет доступен новый результат сканирования, обновляя результат.

  class WifiReceiver extends BroadcastReceiver { public void onReceive(Context c, Intent intent) { sb = new StringBuilder(); wifiList = mainWifi.getScanResults(); for (int i = 0; i < wifiList.size(); i++){ sb.append(new Integer(i+1).toString() + "."); sb.append((wifiList.get(i)).SSID); sb.append("\n"); } mainText.setText(sb); 

После Android 6.0

Если ваша версия ОС Android 6.0 или выше, ваше приложение должно запрашивать следующие разрешения во время выполнения (любой из следующих).

   

Как запросить разрешение во время выполнения

Просто добавьте этот код в метод onResume вашей деятельности

 @Override public void onResume() { super.onResume(); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if(checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 87); } } } 

Что произойдет, если у вас нет указанного разрешения в Runtime?

Wifi.getScanResults () вернет 0 результатов.

Многие люди, включая меня, столкнулись с этой проблемой на телефонах Nexus 5 и назвали ее «ошибкой».

Как сканировать и читать Wi-Fi-сети? (Более глубокое несоответствие)

Сканирование можно запросить

 wifiManager.startScan(); 

boolean startScan () немедленно возвращает true или false в зависимости от того, успешно или нет сканирование.
Однако при запуске сканирования он запускает асинхронное событие, которое отправляет намерение ( WifiManager.SCAN_RESULTS_AVAILABLE_ACTION ). Поскольку результаты сканирования (результат асинхронного события) будут недоступны сразу, вам нужно будет зарегистрировать свою деятельность с помощью BroadcastReceiver.

Вот fragment кода, как читать результат в BroadcastReceiver, если вы хотите прочитать эти результаты.

 public class WifiScanReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { List scanResults = wifimanager.getScanResults(); // Write your logic to show in the list } } } 

Вы можете увидеть эту демонстрацию на BroadcastReceiver

Релевантные ссылки

Результат сканирования возвращает пустой список в Android 6.0

  • Как получить выбранные элементы списка из списка с помощью checkbox и пользовательского адаптера?
  • ArrayAdapter в android для создания простого списка
  • Bubbling прокручивает события из ListView в родительский
  • Рециркуляция и обработка различных типов инфляции строк
  • Отключить прокрутку ListView, содержащегося в ScrollView
  • ArrayAdapter.NotifyDataSetChanged () не работает?
  • Добавление кнопки в список в WinForms
  • выделение выделенного элемента в списке в андроиде
  • Заполнить список пользовательского вида с помощью ListFragment
  • Список нескольких вариантов с пользовательским представлением?
  • Внедрение onScrollListener для обнаружения конца прокрутки в ListView
  • Давайте будем гением компьютера.