как получить доступ к 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); } } }
- Передача списка из одной активности в другую
- Размещение ViewPager в виде строки в ListView
- Как предотвратить мерцание в ListView при обновлении одного текста ListViewItem?
- Элемент списка подобъектов ListView clickable confilct
- Как добавить OnClickListener к кнопке внутри адаптера ListView?
- Получить позицию позиции списка при нажатии кнопки
- Endless RecyclerView с ProgressBar для разбивки на страницы
- ListView в ArrayAdapter order get смешивается при прокрутке
- Отображение контактного номера и имени контакта в пользовательском списке
- Добавление элемента подменю ListView в Android
- Как отключить элемент в элементе управления listview в .net 3.5
- как реализовать прослушиватель длинного клика в списке
- Android, как определить элемент в списке с помощью флажка
Вам необходимо создать 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