android.net.wifi.STATE_CHANGE: не срабатывает при отключении Wi-Fi

Нормально ли иметь широковещательное намерение только с действием NETWORK_STATE_CHANGED_ACTION (которое постоянное значение равно android.net.wifi.STATE_CHANGE) при восстановлении соединения Wi-Fi? т.е. Я не понимаю этого намерения, когда Wi-Fi отключается.

ОБНОВЛЕНИЕ: меня в основном интересует >= 2.2 Froyo


person jldupont    schedule 19.03.2011    source источник
comment
У меня были те же проблемы в течение нескольких недель, и я думаю, что это нормально (или ошибка ;)). Я знаю, что это не поможет, но просто для информации...   -  person RoflcoptrException    schedule 22.03.2011
comment
Просто чтобы уточнить для будущих читателей: это намерение касается состояния (отключено, включение, включение, отключение) приемопередатчика Wi-Fi, в основном сообщая вам, включен или выключен Wi-Fi. Вы искали состояние подключения, которое отличается.   -  person JeffE    schedule 05.11.2011
comment
@JeffE: нет - android.net.wifi.STATE_CHANGE соответствует NETWORK_STATE_CHANGED_ACTION для подключения к сети. WIFI_STATE_CHANGED_ACTION для включения, отключения и т. д. — соответствует android.net.wifi.WIFI_STATE_CHANGED. Пожалуйста, удалите свой запутанный комментарий. На ОП - я думаю, что ответ M Granja правильный.   -  person Mr_and_Mrs_D    schedule 14.11.2013


Ответы (2)


общедоступная статическая окончательная строка SUPPLICANT_CONNECTION_CHANGE_ACTION

С: API уровня 1

Действие широковещательного намерения, указывающее, что соединение с запрашивающей стороной было установлено (и теперь можно выполнять операции Wi-Fi) или соединение с запрашивающей стороной было потеряно. Один дополнительный параметр предоставляет состояние соединения в виде логического значения, где true означает ПОДКЛЮЧЕНО.

См. также

EXTRA_SUPPLICANT_CONNECTED

Постоянное значение: android.net.wifi.supplicant.CONNECTION_CHANGE

В API Android говорится, что не рекомендуется проверять STATE_CHANGE для подключения к сети, и вместо этого вы должны использовать SUPPLICANT_CONNECTION_CHANGE_ACTION. это заметит подключение к сети Wi-Fi и отключение сети Wi-Fi. Не знаю, поможет ли это вам, но я очень на это надеюсь. ССЫЛКА

person Community    schedule 21.03.2011
comment
Я получаю событие изменения соединения при отключении сейчас! Спасибо! - person jldupont; 22.03.2011
comment
Не знаю, но мне не помогло SUPPLICANT_CONNECTION_CHANGE_ACTION. Его никогда не увольняли. Мне пришлось использовать WifiManager.NETWORK_STATE_CHANGED_ACTION, чтобы сделать то же самое. И это сработало как шарм!! - person unrealsoul007; 25.03.2015

У меня была аналогичная потребность в моем проекте, и в итоге мне пришлось использовать оба.

Действие android.net.wifi.supplicant.CONNECTION_CHANGE отправляет широковещательную рассылку, когда сеть подключена, но обычно до того, как устройство получит IP-адрес, поэтому для этого мне понадобилось действие android.net.wifi.STATE_CHANGE.

Действие android.net.wifi.STATE_CHANGE получает широковещательную рассылку при отключении, только если устройство отключается от сети, но Wi-Fi все еще включен (например, когда точка доступа выходит за пределы диапазона).

Таким образом, вы должны указать оба действия для получателя в манифесте:

<receiver android:name="net.moronigranja.tproxy.WifiReceiver">
            <intent-filter>
                    <action android:name="android.net.wifi.STATE_CHANGE"/>
                    <action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" />
            </intent-filter>
</receiver>

и вы ставите if, чтобы проверить, какое действие вызывается в намерении. Вот метод onReceive BroadcastReceiver в моем коде:

public void onReceive(Context c, Intent intent) {
      if(intent.getAction().equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)){ 
          boolean connected = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false);
          if(!connected) {
               //Start service for disconnected state here
          }
      }

      else if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){
          NetworkInfo netInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
          if( netInfo.isConnected() )
          {
              //Start service for connected state here.
          }   
      }
  }
person M Granja    schedule 04.05.2011
comment
несмотря на то, что я использовал отдельный класс для своего широковещательного приемника, проверка запрашивающего была ключом к решению моей проблемы. - person tony gil; 20.07.2012
comment
Не знаю, но мне не помогло SUPPLICANT_CONNECTION_CHANGE_ACTION. Его никогда не увольняли. Мне пришлось использовать WifiManager.NETWORK_STATE_CHANGED_ACTION, чтобы сделать то же самое. И это сработало как шарм!! - person unrealsoul007; 25.03.2015
comment
Да, NETWORK_STATE_CHANGED_ACTION работает как часы, не нужно добавлять в манифест. - person ssi-anik; 12.09.2015
comment
@unrealsoul007 действительно очень поздний ответ, но в текущем положении дел (Lollipop+) я заметил, что перестал получать трансляции SUPPLICANT_CONNECTION_CHANGE_ACTION всякий раз, когда процесс подключения/аутентификации/получения IP/отключения запускался системой, а не моим приложением. Поэтому я предполагаю, что существует некоторая изоляция процессов, препятствующая извлечению BC, либо в системе Android, либо даже в низкоуровневых слоях Linux. В значительной степени я оцениваю, что пользовательские приложения не могут повсеместно установить разницу между подключенным, с IP-адресом, без IP-адреса, ошибкой аутентификации среди других типов состояния запрашивающей стороны. - person leRobot; 20.04.2016
comment
Я тоже это заметил. Тем не менее, вы по-прежнему получаете трансляцию, если мобильные данные отключены, когда беспроводная связь отключается. - person M Granja; 26.04.2016