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 ():
- ¿Cómo puede comprobar si la música está reproduciendo utilizando un receptor de difusión?
- Enviar la emisión con la combinación de localbroadcastmanager sendorderedbroadcast
- Receptor de radiodifusión en fragmento no recibe intención de servicio
- Obtener el identificador de SMS del receptor de difusión
- ¿Por qué noftificaciones aparecen en la barra de notificación de Android por un tiempo, entonces desaparece
@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()
.
- ¿No puedo recibir la emisión en el cambio de estado de la batería?
- Android: OnBootReceiver: El receptor exportado no requiere permiso
- Receptor de transmisión para comprobar la conexión a Internet en la aplicación Android
- ¿Cómo se puede iniciar una actividad desde BroadcastReceiver?
- ¿Cómo notificar la actividad sobre los cambios en la variable global en la aplicación?
- ¿Cómo activar el receptor de difusión cuando gps está encendido / apagado?
- PACKAGE_REMOVED y luego PACKAGE_ADDED se disparan junto con PACKAGE_REPLACED Intent Action
- ReceiverRestrictedContext no se puede convertir en android.app.Activity
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