Obtener la intensidad de la señal WiFi de la red conectada

Estoy tratando de mostrar la fuerza de la señal de la red WiFi conectada en mi aplicación para Android. He intentado lo siguiente:

//Receiver for information on the network info private BroadcastReceiver mNetworkReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d("INFO", "onReceive()"); List<ScanResult> scanResult = mWifi.getScanResults(); for(ScanResult scan : scanResult) { Log.d("INFO","Network strength: " + String.valueOf(scan.level) + " dBm " + scan.SSID); } } }; 

Y luego hago el registro / anulación de registro de mi receptor en el onResume () / onPause ():

 @Override public void onResume() { super.onResume(); mActivity.registerReceiver(mNetworkReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); //network info } @Override public void onPause() { super.onPause(); mActivity.unregisterReceiver(mNetworkReceiver); } 

Pero esto no parece funcionar. También tengo habilitado el permiso ACCESS_WIFI_STATE . Mi receptor sólo se llama si llamo a <WiFiManager>.startScan() manualmente, pero estoy intentando que funcione con mi receptor de difusión para que siempre pueda mostrar la intensidad de la señal cada vez que cambia. Me di cuenta de que el onReceive() proporciona una lista que es innecesaria si sólo quiero estadísticas de la red conectada. Cualquier forma de cambiar eso también?

editar: También, me doy cuenta de que hay algunas preguntas relacionadas con esto, pero las que he leído no fueron muy útiles. edit2: Clarifiqué mi pregunta un poco. El problema principal es que mi receptor nunca se llama a menos que yo llame a startScan() .

bien este código está trabajando muy bien conmigo para informar la fuerza de la señal de WiFi cuando cambia usando el pan tostado, así que

Mi receptor es así

 @Override public void onReceive(Context context, Intent intent) { List<ScanResult> results = wifiDemo.wifi.getScanResults(); ScanResult bestSignal = null; for (ScanResult result : results) { if (bestSignal == null || WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0) bestSignal = result; } String message = String.format("%s networks found. %s is the strongest.", results.size(), bestSignal.SSID); Toast.makeText(context, message, Toast.LENGTH_LONG).show(); Log.d("Debug", "onReceive() message: " + message); } 

esto es lo que en mi actividad de inicio para registrar Receiver y obtener Wifi Info en TextView

 public class WiFiDemo extends Activity { WifiManager wifi; BroadcastReceiver receiver; TextView textStatus; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Setup UI textStatus = (TextView) findViewById(R.id.textStatus); // Setup WiFi wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); // Get WiFi status WifiInfo info = wifi.getConnectionInfo(); textStatus.append("\n\nWiFi Status: " + info.toString()); // List available networks List<WifiConfiguration> configs = wifi.getConfiguredNetworks(); for (WifiConfiguration config : configs) { textStatus.append("\n\n" + config.toString()); } // Register Broadcast Receiver if (receiver == null) receiver = new WiFiScanReceiver(this); registerReceiver(receiver, new IntentFilter( WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); Log.d(TAG, "onCreate()"); } @Override public void onStop() { unregisterReceiver(receiver); super.onStop(); } } 

poner vista de desplazamiento en TextView en archivo de diseño XML

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ScrollView android:id="@+id/ScrollView01" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/textStatus" android:text="WiFi Connections :" /> </ScrollView> </LinearLayout> 

y finalmente mi manifiesto es así

  <uses-sdk android:minSdkVersion="10" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"> </uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"> </uses-permission> <activity android:name=".WiFiDemo" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".WiFiScanReceiver"> <intent-filter> <action android:name="com.rdc" /> </intent-filter> </receiver> 

todavía tiene cualquier problema que me haga saber!

Haga esto en su reciver–

 final List<ScanResult> results = _wifiManager.getScanResults(); //do it to get connected info.. // final WifiInfo wifiInfo = _wifiManager.getConnectionInfo(); // int connectedRssi= wifiInfo.getRssi(); if (results != null) { for (final ScanResult result : results) { int rssi=result.level; } scanResult(rssi); } 

Haga una interfaz para escanear resultados y llámelo en su actividad donde quiera que quiera mostrarla …

  public void scanResult(int rssi){ _rssiText.setText(rssi); } 

Permisos manifiestos:

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

Espero que esto te ayude …

Si desea sólo controlar la intensidad de la señal WiFi actual puede utilizar IntentFilter con WifiManager.RSSI_CHANGED_ACTION , no el WifiManager.SCAN_RESULTS_AVAILABLE_ACTION

  • NullPointerException al usar LocalBroadcastManager
  • BroadcastReceiver recibe varios mensajes idénticos para un evento
  • Eventos XMPP en Android
  • BroadcastReceiver para CONNECTIVITY_ACTION devuelve siempre null en intention.getExtras ()
  • ¿Cómo distinguir el estado de encendido / apagado de la pantalla durante la llamada entrante?
  • deshabilitar el paquete que instala mediante programación
  • NotificationManager.cancel (id) no funciona dentro de un receptor de difusión
  • No se puede encontrar el receptor definido Definido ~ 1% del tiempo
  • Android: ejecutando una tarea de fondo con AlarmManager
  • El envío de una nueva intención a un receptor de radiodifusión da valores extras de intenciones anteriores
  • ¿Los receptores de radiodifusión para Android consumen la vida de la batería?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.