2010-12-01 30 views
1

Mon application Android ne peut fonctionner avec connexion Wi-Fi connecté à Internet. Ainsi, j'utilise le code suivant pour vérifier si l'appareil est connecté:Problème: isConnected Android() utilisé pour obtenir l'état actuel de la connexion Wi-Fi retourne souvent faux, même lorsque l'appareil est connecté

ConnectivityManager conMgr = (ConnectivityManager)getSystemService(Activity.CONNECTIVITY_SERVICE); 
boolean wifi = conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected(); 

Cependant, très souvent lorsque l'application est lancée et connexion Wi-Fi connecté à Internet, je reçois la notification qui n'apparaît lorsque wifi = false. Ai-je manqué quelque chose, ou le chèque n'est pas si précis?

+0

Même avec 'isConnectedOrConnecting()'? Je ne connais pas les composants internes du module WIFI, mais je pourrais deviner que - lors du renouvellement du bail dhcp ou de quelque chose comme ça - l'état est connecté. Cela n'aurait pas beaucoup de sens, mais pls. essayer. Et vous avez la permission dans votre AndroidManifest.xml, n'est-ce pas? –

+0

N'a pas essayé, mais je le ferai. Test cela prendra un certain temps, je posterai une mise à jour quand j'en saurai plus. Merci. (Et je ne vous avoir l'autorisation nécessaire dans le manifeste.) – ernes7a

+0

Eh bien, semble comme isConnectedOrConnecting() résout le problème de la « fausse alarme ». Cependant, il a aussi son inconvénient - si l'utilisateur ouvre mon application lorsque l'appareil se connecte à Internet (même si c'est une question de secondes), l'application se bloque. – ernes7a

Répondre

0

J'utilise le code comme ceci:

public static String getCurrentSsid(Context context) { 
    final WifiInfo wifiInfo = getCurrentWifiInfo(context); 
    if (wifiInfo != null && !StringUtil.isBlank(wifiInfo.getSSID())) { 
    return wifiInfo.getSSID(); 
    } 
    return null; 
} 

public static WifiInfo getCurrentWifiInfo(Context context) { 
    final ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    final NetworkInfo networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
    if (networkInfo != null && networkInfo.isConnected()) { 
    final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
    return wifiManager.getConnectionInfo(); 
    } 

    return null; 
} 

En même temps, être au courant de ces deux questions 19078 et 3641.

2

Mon projet repose également sur le site Wifi (bien que j'utilise un réseau privé). Ce qui suit est mon code pour la mise en place d'une connexion Wifi au démarrage:

private void initWIFI (WifiManager wifiMgr, String SSID, String key) 
{ 
    WifiInfo curr; 
    if (null == (curr = wifiMgr.getConnectionInfo())) // Get current wifi state 
    { 
     joinNetwork (wifiMgr, SSID, key); 
    } 
    else switch (curr.getSupplicantState()) 
    { 
     case DISCONNECTED: 
     case DORMANT: 
     case INACTIVE: 
     case SCANNING: 
      joinNetwork (wifiMgr, SSID, key); 
      break; 

     default: 
      if (!curr.getSSID().equals (SSID)) 
       joinNetwork (wifiMgr, SSID, key); 
    } 

    while (wifiMgr.getConnectionInfo().getIpAddress() == 0) 
    { 
     try 
     { 
      Thread.sleep (1000); 
     } 
     catch (Exception e) 
     { } 
    } 
} 

/**This method is used to join the proper WiFi network when necessary. Normally, 
* the Android retains network configuration and it is not necessary to manually 
* re-join the desired network on software startup. However, when it is determined 
* that the Android is not currently attached to the proper network, this function 
* is used to correct that situation. */ 
private void joinNetwork (WifiManager wifiMgr, String SSID, String key) 
{ 
    try 
    { 
     WifiConfiguration wc   = new WifiConfiguration(); 

     wc.allowedAuthAlgorithms.set (WifiConfiguration.AuthAlgorithm.OPEN); 
     wc.allowedAuthAlgorithms.set (WifiConfiguration.AuthAlgorithm.SHARED); 

     wc.allowedGroupCiphers.set (WifiConfiguration.GroupCipher.WEP40); 
     wc.allowedGroupCiphers.set (WifiConfiguration.GroupCipher.WEP104); 

     wc.allowedKeyManagement.set (WifiConfiguration.KeyMgmt.NONE); 

     wc.allowedPairwiseCiphers.set (WifiConfiguration.PairwiseCipher.TKIP); 
     wc.allowedPairwiseCiphers.set (WifiConfiguration.PairwiseCipher.CCMP); 

     wc.allowedProtocols.set  (WifiConfiguration.Protocol.WPA); 
     wc.allowedProtocols.set  (WifiConfiguration.Protocol.RSN); 

     wc.hiddenSSID    = false; 
     wc.priority     = 32; 

     wc.SSID      = "\"" + SSID + "\""; 
     wc.status     = WifiConfiguration.Status.ENABLED; 

     wc.wepKeys[0]    = key; 
     wc.wepTxKeyIndex    = 0; 

     int netID;     
     if (-1 == (netID    = wifiMgr.addNetwork (wc))) 
     { 
      listener.lostConnection (true); 
     } 
     else 
     { 
      wifiMgr.enableNetwork (netID, true); 
      Thread.sleep (5000); // Delay to allow the DHCP process to work 
     } 
    } 
    catch (Exception e) 
    { 
     listener.lostConnection (true); 
    } 
} 

Il y a lieu de relever que j'utilise toujours le même point d'accès sans fil, et est spécifiquement configuré le code dans joinNetwork() pour elle, donc si votre configuration doit être plus flexible, votre solution peut être plus complexe. Malheureusement, je ne me souviens pas du site web où j'ai trouvé le point de départ de ce code, mais il n'a pas fallu beaucoup de Googling pour le trouver. Enfin, je suis certain que votre application doit avoir les permissions ACCESS_WIFI_STATE et CHANGE_WIFI_STATE.

+0

Merci Rich, mais votre réponse semble être un peu hors de propos pour mon problème. Je n'ai pas vraiment besoin de mon application pour me connecter au réseau, il faut juste vérifier l'état du réseau. Mon problème est que parfois la méthode que j'utilise renvoie un faux résultat. – ernes7a

+0

Je comprends, et j'avais besoin de la même chose pour mon application. Il se peut que je prends un regard trop détaillé, mais mon code vérifie d'abord l'existence de la connexion Wi-Fi, puis son état, sa connexion, sa configuration, tous a été très fiable pour déterminer si j'ai avoir la fonctionnalité réseau sans compter sur isConnected() - qui ne fonctionne pas toujours pour vous. Je crois que vous pouvez adapter ce processus pour vos besoins et d'éviter les problèmes que vous avez eu avec isConnected() ... – Rich

+0

De plus, je trouve cette page Web pour être très utile pour déterminer comment travailler avec ma connexion wifi Android : http://kmansoft.wordpress.com/2010/04/08/adding-wifi-networks-to-known-list/ – Rich