Проблема: isConnected () Android, используемый для получения текущего состояния WiFi, часто возвращает false, даже когда устройство подключено - PullRequest
1 голос
/ 01 декабря 2010

Мое приложение для Android может работать только с WiFi, подключенным к Интернету.Таким образом, я использую следующий код, чтобы проверить, подключено ли устройство:

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

Однако, очень часто, когда приложение запускается и WiFi подключен к Интернету, я получаю уведомление, которое отображается только когда1004 *.Я что-то пропустил или чек не такой точный?

Ответы [ 2 ]

2 голосов
/ 01 декабря 2010

Мой проект также использует Wi-Fi (хотя я использую частную сеть). Ниже приведен мой код для настройки соединения Wi-Fi при запуске:

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

Следует отметить, что я всегда использую одну и ту же точку беспроводного доступа, и код в joinNetwork () специально настроен для нее, поэтому, если ваша конфигурация должна быть более гибкой, то ваше решение может быть более сложным. К сожалению, я не помню веб-сайт, где я нашел отправную точку для этого кода, но это не заняло тонну Googling, чтобы найти его. Наконец, я уверен, что ваше приложение должно иметь разрешения ACCESS_WIFI_STATE и CHANGE_WIFI_STATE.

0 голосов
/ 18 июня 2012

Я использую такой код:

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

В то же время помните об этих двух проблемах 19078 и 3641 .

...