Android: cómo controlar la potencia de la señal wifi

Recibiría notificaciones cuando cambie la intensidad de la señal. Intenté crear el siguiente método y llamarlo en onCreate ():

private void initializeWiFiListener(){ Log.i(TAG, "executing initializeWiFiListener"); String connectivity_context = Context.WIFI_SERVICE; final WifiManager wifi = (WifiManager)getSystemService(connectivity_context); if(!wifi.isWifiEnabled()){ if(wifi.getWifiState() != WifiManager.WIFI_STATE_ENABLING){ wifi.setWifiEnabled(true); } } registerReceiver(new BroadcastReceiver(){ @Override public void onReceive(Context context, Intent intent) { WifiInfo info = wifi.getConnectionInfo(); //TODO: implement methods for action handling } }, new IntentFilter(WifiManager.RSSI_CHANGED_ACTION)); } 

Agradecería si alguien pudiera verificar si el método está escrito correctamente. Traté de ejecutar la aplicación, pero no he recibido ninguna notificación y no estoy seguro de si es porque la intensidad de la señal puede ser constante en el lugar donde ejecuto la depuración o porque falta algo.

¡Gracias!

Primero, asegúrese de tener para ACCESS_WIFI_STATE en su manifiesto.

En segundo lugar, no estoy seguro acerca de las notificaciones para una sola conexión, pero para recibir notificaciones de todo lo que la radio está viendo, puede iniciar una exploración:

 wifi.startScan(); 

Luego, cuando recibí resultados exitosos, utilicé WifiManager.SCAN_RESULTS_AVAILABLE_ACTION en IntentFilter .

Luego, en el receptor, uso getScanResults() del objeto WifiManager , que también contiene la potencia de la señal.

Para detenerlo de esta manera, simplemente llame para unregisterRecever() de unregisterRecever() (por lo que querrá mantenerlo para referenciar). No me he probado a mí mismo para ver si mi código de escaneo puede modificarse solo para verificar la conexión actual, pero sí sé que obtuve muchos resultados: las señales de Wi-Fi cambian con frecuencia y rapidez. Supongo que para monitorear una sola conexión, también puede filtrar los resultados del análisis y buscar el que el dispositivo está actualmente conectado.

Espero que esto ayude un poco.

Solo para soltar mi solución:

en mi aplicación tengo

 @Override protected void onResume() { super.onResume(); networkStateReceiver = new NetworkStateReceiver(this); this.registerReceiver(networkStateReceiver, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE")); this.registerReceiver(networkStateReceiver, new IntentFilter("android.net.wifi.SCAN_RESULTS")); networkStateReceiver.registerListener(this); } 

Y el onReceive en mi Receiver se ve así:

 @Override public void onReceive(Context context, Intent intent) { NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnectedOrConnecting()) { switch (networkInfo.getType()) { case ConnectivityManager.TYPE_ETHERNET: this.networkStateMessage = new NetworkStateMessage(networkInfo); break; case ConnectivityManager.TYPE_WIFI: this.networkStateMessage = new NetworkStateMessage(networkInfo, wifiManager.getConnectionInfo()); worker.schedule(new Runnable() { @Override public void run() { wifiManager.startScan(); } }, 5, TimeUnit.SECONDS); break; default: this.networkStateMessage = null; break; } } notifyStateToAll(this.networkStateMessage); } 

La idea es startScan() solo cada 5 segundos si el wifi es la red activa.