cómo obtener redes wifi disponibles y mostrarlas en una lista en Android

amigos. Quiero encontrar todas las redes Wi-Fi disponibles y mostrarlas en una lista que he intentado a continuación … Pero no funciona. He editado mi código y ahora recibí el resultado, pero con todo el resultado que no necesito. solo necesito el nombre de la red wifi en mi lista.

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

Necesita crear un BroadcastReceiver para escuchar los resultados del escaneo Wifi:

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

En onCreate() asignaría mWifiManager e iniciaría un escaneo:

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

getScanResults() devolverá datos solo si tiene los permisos adecuados. Para esto, agregue una de las dos líneas siguientes a su AndroidManifest.xml :

   

También tenga en cuenta que en la API 23+, los permisos deben solicitarse en tiempo de ejecución. (Para un entorno de laboratorio, también puede otorgar permisos manualmente en Configuración, se requiere menos encoding, pero no se recomienda para una aplicación de usuario final).

Tenga en cuenta que el código que maneja los resultados de su exploración se ejecutará cada vez que haya un nuevo resultado de escaneo disponible, actualizando el resultado.

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

Después de Android 6.0

Si su versión del sistema operativo Android es 6.0 o superior, entonces su aplicación debe solicitar el siguiente permiso en tiempo de ejecución (cualquiera de los siguientes).

   

Cómo pedir el permiso en tiempo de ejecución

Solo agregue este código en el método onResume de su actividad

 @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); } } } 

¿Qué pasará si no tienes el permiso anterior en Runtime?

Wifi.getScanResults () devolverá 0 resultados.

Muchas personas, incluyéndome a mí, han enfrentado este problema en los teléfonos Nexus 5 y lo han referido como un “error”.

¿Cómo escanear y leer redes wifi? (Más profundo incomprensible)

El escaneo puede ser solicitado por

 wifiManager.startScan(); 

boolean startScan () devuelve verdadero o falso de inmediato en función del hecho de si el escaneo ha comenzado correctamente o no.
Sin embargo, inicia un evento asíncrono que envía una intención ( WifiManager.SCAN_RESULTS_AVAILABLE_ACTION ) cuando finaliza el análisis. Dado que los resultados del análisis (resultado de evento asíncrono) no estarán disponibles de inmediato, tendrá que registrar su actividad con un BroadcastReceiver.

Aquí está el fragmento de código de cómo leer el resultado en BroadcastReceiver si quiere leer esos resultados.

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

Puedes ver esta demostración en BroadcastReceiver

Enlaces relevantes

El resultado del escaneo devuelve una lista vacía en Android 6.0