2009-07-30 17 views
11

Recibiría notificaciones cuando cambie la intensidad de la señal. Intenté crear el siguiente método y lo llaman en el onCreate():Android: Cómo controlar la intensidad de la señal WiFi

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

Le agradecería si alguien pudiera comprobar 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!

Respuesta

12

Primero, asegúrese de tener <uses-permission> para ACCESS_WIFI_STATE en su manifiesto.

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

wifi.startScan(); 

A continuación, cuando he recibido con éxito resultados, utilicé WifiManager.SCAN_RESULTS_AVAILABLE_ACTION en el 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 al unregisterRecever() (por lo que querrá guardarlo para consultar). 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.

+2

¿Podría desarrollar su respuesta un poco, por favor? – Vervatovskis

0

Sólo para dejar 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 receptor se parece a:

@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 la de startScan() sólo cada 5 segundos si el wifi es la red activa.

Cuestiones relacionadas