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.
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? –
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
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