2011-03-10 21 views
5

Esto me está matando y cualquier ayuda sería muy apreciada.Android wifimanager siempre devuelve verdadero

Quiero conectarme a una red abierta usando el administrador de wifi. El problema que tengo es que el código reclama conexión a cualquier red, incluso las que no existen. A continuación se muestra el código completo que se ejecuta y se llama con el SSID de una red. No importa qué cadena le pase como el SSID de una red, incluso si dicha red no existe en ninguna forma o forma, los reclamos de enableNetwork son verdaderos, lo que creo que significa que está conectado a la red.

Lo que tengo que hacer es asegurarme de tener una conexión. Entonces, si paso un SSID de red que no existe (por ejemplo, está fuera de rango) la API debería devolver una falla al intentar conectarse.

Cualquier idea/pista/sugerencia sería muy apreciada.

public boolean conto (String network){ 

    WifiConfiguration wifiConfiguration = new WifiConfiguration(); 
    wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
    List<WifiConfiguration> configs = null; 
    int inetId = -1; 


    // make sure there are no funny stuff in the config 
    configs = wifi.getConfiguredNetworks(); 
    for (WifiConfiguration config : configs) { 
     wifi.removeNetwork(config.networkId); 
     Log.d("********", "Removed Network: SSID=[" + config.SSID + "] and ID=[" + config.networkId + "]"); 

    } 

    // Now add the network 
    wifiConfiguration.SSID = "\"" + network + "\""; 
    wifiConfiguration.hiddenSSID = false; 
    //wifiConfiguration.priority = 1; 
    //wifiConfiguration.networkId = 999; 

    inetId = wifi.addNetwork(wifiConfiguration); 
    if(inetId < 0) { 
      Log.d("********", "Could Not Add Network......... [" + wifiConfiguration.SSID + "]"); 

     } 
     else { 

      Log.d("********", "Added Network......... [" + wifiConfiguration.SSID + "]"); 

      // Lets be paranoid and double check the config file 
      Log.d("********", " +++++++++++++++++++++++++ This is what I have in Config File"); 
      configs = wifi.getConfiguredNetworks(); 
      for (WifiConfiguration config : configs) { 
       Log.d("********", "In the Config file after add, SSID=[" + config.SSID + "], ID=[" + config.networkId + "]"); 

      } 

      // Now Enable the network 
      boolean successConnected = wifi.enableNetwork(inetId, true); 
      //boolean successAssociated = wifi.reassociate(); This did not change the results 

      if(successConnected) { 
       Log.d("********", "Connected to......... [" + inetId + "]"); 
      } 
      else { 

       Log.d("********", "Could Not Connect to......... [" + inetId + "]"); 

      } 


     } 
     return false; 
    } 
+0

¿Alguna vez resolvió esto? Estoy teniendo el [mismo problema] (http://stackoverflow.com/questions/11378452/android-wifimanager-making-a-phantom-connection). – gcl1

Respuesta

9

Creo que el problema es que su código se basa en el supuesto de que conectarse a una red WiFi es un proceso síncrono, que no lo es. El método enableNetwork() no se bloquea mientras se produce la conexión y luego devuelve el éxito o el fracaso de la conexión, vuelve inmediatamente y el resultado es simplemente si la solicitud llegó correctamente al servicio WiFi y al solicitante.

Si desea visibilidad de lo que está pasando con el estado de conexión del dispositivo, es necesario supervisar las acciones WifiManager. SUPPLICANT_STATE_CHANGED_ACTION y WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION Intención transmitiendo con una BroadcastReceiver. Una vez que inicie el proceso de conexión, estas devoluciones de llamadas le indicarán cómo progresan las cosas. Por ejemplo, si pasa en una red que no existe, el estado de la conexión debe ir casi inmediatamente a DESCONECTADO. Mientras que una red válida pasará por el proceso de asociación, autenticación y conexión. Todos estos pasos se enumeran a través de estas transmisiones.

Cuestiones relacionadas